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

Posted

技术标签:

【中文标题】使用 PyQT,如何为带有自定义列表的 QComboBox 过滤 mousePressEvent【英文标题】:Using PyQT, how do you filter mousePressEvent for a QComboBox with custom list 【发布时间】:2010-10-10 20:26:41 【问题描述】:

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

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

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

其他截图

所有节点都折叠了:

列表隐藏:

【问题讨论】:

你能再发一张隐藏列表的截图吗?我不太了解列表折叠时发生的情况。 原始屏幕截图显示了一些展开的节点。此屏幕截图显示所有折叠的节点:garyvdm.googlepages.com/revision-selector-collapased.png 此屏幕截图显示隐藏的列表:garyvdm.googlepages.com/revision-selector-hidden.png 【参考方案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 在弹出窗口可见时延迟绘制事件。

希望有帮助!

【讨论】:

为了清楚起见,您显然必须实现 self.OkToHide() :) 我在组合框上试过了。 hideEvent 仅在窗口关闭时被调用。我将以下 hideEvent 添加到列表中。它被调用 - 但不会阻止隐藏。 def hideEvent(self, event): event.ignore() > 为什么不是 TreeView?嗯 - 我正在使用 TreeView 控件 - 但我重新实现了节点的扩展和折叠 - 因为我显示的数据是 DAG 而不是树 - 对要求有点不同。有关 DAG 的示例,请参阅:garyvdm.googlepages.com/qlog.png 感谢@NorthCat。这些答案的长尾是惊人的:D【参考方案2】:

QT 有一个“捕获”QEvent.MouseButtonReleaseeventFilter。所以我所做的是安装我自己的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

【讨论】:

以上是关于使用 PyQT,如何为带有自定义列表的 QComboBox 过滤 mousePressEvent的主要内容,如果未能解决你的问题,请参考以下文章

如何为自定义控件创建事件

如何为动态生成的内容编写自定义表单助手模板?

PyQt:如何为单个标题设置不同的标题大小?

如何为 Laravel 工厂使用自定义值列表,维护订单并仍在使用 Faker 外观?

如何为图像分割创建带有掩码的自定义图像数据集?(特别是对于 Tensorflow)

如何为列表视图创建自定义适配器?获取 ResourceNotFoundException