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

Jim Bublitz jbublitz at nwinternet.com
Fri Mar 6 18:05:26 GMT 2009


On Friday 06 March 2009 09:06:03 am Andreas Pakulat wrote:
> On 06.03.09 08:40:17, Jim Bublitz wrote:
> > 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.
>
> The header views are qwidgets as well, so I don't see why that would
> be necessary.

Because you'd have to subclass them and replace the QTableWidget's 
original headers. It seems easier to install an event filter, but 
either method would work.

> Apart from that, its even possible without overriding any base class,
> using QWidget.setContextMenuPolicy (set to Qt.CustomContextMenu) and
> catching the customContextMenuRequested() signal from the same
> widget.

That's probably easier than installing an event filter - wasn't aware of 
that.

Jim

> Or by using the Qt::ActionsContextMenu and adding a bunch of QActions
> to the table. Then you don't even need to take care of creating a
> menu.
>
> Andreas




More information about the PyQt mailing list