[PyQt] How can I capture some mouse events but ignore others?

Jim Bublitz jbublitz at nwinternet.com
Fri Mar 6 16:40:17 GMT 2009


On Friday 06 March 2009 06:53:01 am Marc Nations wrote:
> Hi,
> I'm trying to create a custom table which pops up a menu when the
> user right clicks. This part works ok. It looks like this:
>
> class Table(QtGui.QTableWidget):
>     def __init__(self, parent,  gui):
>         QtGui.QTableWidget.__init__(self, parent)
>         self.gui = gui
>
>     def mouseReleaseEvent(self, event):
>         if event.button() == QtCore.Qt.RightButton:
>             self.rightClickMenu(event)
>
>
>     def rightClickMenu(self,  event):
>         pos = event.pos
>         self.gui.ui.menuEdit.popup(QtGui.QCursor.pos())
>
>
> The problem is that the default before of left click is changed, and
> I can't reset it. Without the mods the left clicks acts where if a
> multiple selection is made then clicking on another table cell
> de-selects all the previous items (unless a modifier key is used).
> With the above method, once multiple selections are made then it
> basically goes into <shift> mode and all previous selections are
> kept. I can't figure out a way to turn that off.
>
> Is there a way to cherry pick which mouse events you want and ignore
> the rest, basically letting them keep their default behavior? Because
> it looks like once the function is taken over then the default
> behaviors are lost.

Look at QWidget.contextMenuEvent - it catches only right clicks. 
Overload that.

If you want to grab those on the vertical or horizontal headers, I think 
you'll have to install an event filter on the respective QHeaderViews 
(QObject.installEventFilter) and grab only QContextMenuEvents for those 
objects.

Jim


More information about the PyQt mailing list