Qt - 如何暂时禁用所有事件或窗口功能?

3
我有一个带有许多按钮、用户可交互小部件等的Qt程序。
在程序的某个阶段,我想让所有小部件暂时“停止工作”;停止对鼠标点击的响应,而是将事件传递给一个函数。
(这样用户就可以选择一个小部件来执行元操作。部分解释在这里:获取Qt小部件的变量名(用于样式表)?
用户通过单击小部件来选择要处理的小部件,当然,单击按钮不会导致绑定函数运行。
什么是正确的(最抽象、最合理)方法?
(不涉及太多新代码。即:不是子类化每个小部件)
Qt中是否有专门为此设计的内容?
到目前为止,我能够检索出程序中所有小部件的列表(通过调用
QObject.findChildren(QtGui.QWidget)

因此解决方案可以包含这一点。

我目前的可怕想法是:

  • 以某种方式在一个函数中处理所有应用程序事件,并在需要应用程序停止时不允许通过事件。
  • 当我需要休眠时,创建一个新的透明小部件,它接收鼠标点击并将其拉伸到整个窗口。获取点击的坐标并找出下面的小部件。
  • 以某种方式创建窗口的新“shell”实例。

谢谢!
(抱歉写得很糟糕;有点赶)


Python 2.7.2
PyQt4
Windows 7

2个回答

4

这正是解决方案。如果你想“窃取”所有事件,可以在qApp上放置一个事件过滤器,它将阻止任何子对象接收它们。 - synthesizerpatel
事件过滤什么也没做。尽管所有事件都被忽略了,但点击按钮仍然会运行函数!(除非我很蠢不知道自己在做什么;是真的) - Anti Earth
1
如果您想停止事件的进一步处理,请确保从您的eventFilter()返回true。此外,过滤所有事件是一个非常糟糕的想法 - 只过滤用户输入。更直接的方法是在您的顶层小部件上调用setEnabled(false)。 - Dan Milburn

1

Graphite先回答了这个问题,所以应该给予他应有的荣誉。

关于PySide的实际示例,这里有一个你可能可以从中提取一些有用代码的示例:

my_app.py

from KeyPressEater import KeyPressEater

if __name__ == "__main__":
    app = QApplication(sys.argv)
    eater = KeyPressEater()
    app.installEventFilter(eater)

KeyPressEater.py

class KeyPressEater(QObject):

    # subclassing for eventFilter


    def eventFilter(self, obj, event):

        if self.ignore_input:
            # swallow events
            pass
        else:
            # bubble events 

        return QObject.eventFilter(self,obj,event)

不太理解类的结构。(你怎么有一个 ignore_input 属性?KeyPressEater 没有构造函数)。不过我一定会研究 eventFilter。谢谢! - Anti Earth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接