2

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

截屏。

自定义列表对象具有自定义mousePressEvent功能,因此当用户单击带有 +/-(曲折)的圆圈之一时,列表会展开/折叠。

当我将列表与组合框一起使用时,当用户单击扭曲时,列表会展开/折叠,但选择会更改,并且列表会隐藏。我怎样才能过滤这个,以便当用户点击一个曲折时,选择不会改变,列表不会隐藏。

附加屏幕截图

所有节点都崩溃了: 所有节点都崩溃了。

列表隐藏: 隐藏列表的屏幕截图。

4

2 回答 2

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

之前的mousePressEvent运行mouseReleaseEvent

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

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
于 2009-03-19T23:32:48.373 回答
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)"or"highlighted(int index)"信号连接到可以调用的插槽,该插槽"showPopup()"将重新引发列表项。如果您遇到令人讨厌的消失/出现绘制问题,您可能必须让 Qt 在弹出窗口可见时延迟绘制事件。

希望有帮助!

于 2009-03-03T05:55:00.970 回答