【问题标题】:How to intercept and propagate an event from overlapping widgets如何从重叠的小部件中拦截和传播事件
【发布时间】:2015-02-04 13:08:43
【问题描述】:

我想拦截来自放置在另一个小部件顶部的小部件的事件,而不使用它。

这是我到目前为止所得到的。单击重叠部分时,我希望它打印“Hello World”,但我得到的只是“Hello”。

import sys
from PyQt5 import QtWidgets


class Button(QtWidgets.QPushButton):
    def mousePressEvent(self, event):
        print self.text()
        return super(Button, self).mousePressEvent(event)


app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
window.setFixedSize(200, 100)

button1 = Button("World", window)
button1.move(10, 10)
button2 = Button("Hello", window)
button2.move(50, 15)

window.show()
app.exec_()

这是 QML 中的一个示例,可以满足我的要求。

import QtQuick 2.0


Item {
    id: root
    width: 200; height: 100

    MouseArea {
        anchors.fill: parent
        onPressed: console.log("World")
    }

    Rectangle {
        color: "green"
        width: 100; height: 50
        x: 10; y: 10

        MouseArea {
            anchors.fill: parent
            propagateComposedEvents: true
            onPressed: {
                console.log("Hello");
                mouse.accepted = false;
            }
        }
    }
}

单击窗口会生成“World”,而单击绿色矩形会生成“Hello”,然后是“World”。这里的关键是propagateComposedEvents

【问题讨论】:

  • 嗨,我写信澄清一下,你有没有解决过这个问题,“从重叠的小部件传播事件”?我有一个类似的案例link
  • 哦,不确定。不久前,我想可能是这样:stackoverflow.com/a/27417852/478949

标签: python qt pyqt qml pyside


【解决方案1】:

有一个 window attribute 可以满足您的需求:

button = Button("Hello", window)
button.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)

【讨论】:

  • 谢谢,但我认为您可能误读了这个问题。我不希望它忽略“Hello”,我希望它同时打印“Hello”“World”;即重叠的小部件接收事件,但也将其传递给直接位于其下方的任何小部件。
  • @MarcusOttosson。很公平,但是您的问题非常具有误导性(并且自相矛盾)-特别是在您说“最顶层的小部件应该是完全透明的-即对底层小部件没有影响”的地方。此外,示例代码似乎有缺陷,并且隐藏了跟踪器问题中表达的实际意图。 (在 SO 问题中链接到场外资源通常不是一个好主意:始终尝试将所有相关信息放在问题本身中)。
  • 抱歉,@ekhumoro,如果您找到更好的表达方式,欢迎您编辑问题。我觉得有必要添加“透明度”注释,否则有人可能会建议在每个底层小部件上安装事件过滤器,或者通过QApplication.postEvent 手动传播。现在编辑问题。
猜你喜欢
  • 2012-02-05
  • 1970-01-01
  • 2011-04-10
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 2014-09-26
相关资源
最近更新 更多