使用PyQT,如何使用自定义列表过滤带有QComboBox的mousePressEvent

时间:2009-03-02 18:55:19

标签: python qt qt4 pyqt qcombobox

我有一个带有自定义列表对象的QComboBox

Screenshot.

自定义列表对象具有自定义mousePressEvent,因此当用户点击其中一个带有+/-(一个曲折)的圆圈时,该列表将展开/折叠。

当我使用带有组合框的列表时,当用户点击曲折时,列表会展开/折叠,但选择会更改,并且列表会被隐藏。如何对此进行过滤,以便当用户点击曲折时,选择不会更改,并且列表不会隐藏。

其他屏幕截图

所有节点都已崩溃: All nodes collapsed.

隐藏列表: Screenshot with the list hidden.

2 个答案:

答案 0 :(得分:2)

QT有eventFilter“捕获”QEvent.MouseButtonRelease。所以我所做的就是安装我自己的eventFilter,如果用户点击某个节点,它会过滤QEvent.MouseButtonRelease个事件。

在我的列表对象中,我有以下方法:

def mousePressEvent (self, e):
    self.colapse_expand_click = False
    if <user clicked node>:
        colapse_expand_node()
        e.accept ()
        self.colapse_expand_click = True

mousePressEventmouseReleaseEvent之前运行。

然后在自定义组合框中,我过滤了事件:

class RevisionSelectorWidget(QtGui.QComboBox):
    def __init__(self, parent = None):
        QtGui.QComboBox.__init__(self, parent)

        self.log_list = RevisionSelectorLogList(self)
        self.setView(self.log_list)
        self.log_list.installEventFilter(self)
        self.log_list.viewport().installEventFilter(self)

    def eventFilter(self, object, event):
        if event.type() == QtCore.QEvent.MouseButtonRelease:
            if self.log_list.colapse_expand_click:
                return True
        return False

答案 1 :(得分:1)

在我的脑海中,你可以继承QComboBox并覆盖hideEvent(QHideEvent)(继承自QWidget

def hideEvent(self, event):
  if self.OkToHide():
    event.accept()
  else:
    event.ignore()

你的截图看起来像是一个有趣的组合框使用,我很好奇为什么你没有使用TreeView样式控件而不是列表?

编辑(2009年3月14日):

我查看了Qt源代码,看起来当捕获键盘和鼠标事件时,一旦qt决定发出"activated(int index)"信号,就会调用"hidePopup()"

除了重写其事件过滤器代码之外,另一个选择是将"activated(int index)""highlighted(int index)"信号连接到可以调用"showPopup()"的插槽,这将重新提升列表项。如果你得到一个令人讨厌的消失/出现油漆问题,你可能必须让Qt延迟油漆事件,同时弹出窗口可见。

希望有所帮助!