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

Andreas Pakulat apaku at gmx.de
Fri Mar 6 17:06:03 GMT 2009


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.

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. 

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

-- 
Good day to let down old friends who need help.


More information about the PyQt mailing list