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

Posted

技术标签:

【中文标题】Qt - 暂时禁用所有事件或窗口功能?【英文标题】:Qt - Temporarily disable all events or window functionality? 【发布时间】:2012-01-25 08:06:31 【问题描述】:

我有一个 Qt 程序,其中包含许多按钮、用户可交互的小部件等。 在程序的一个阶段,我希望所有小部件暂时“停止工作”;停止对鼠标单击的行为,而是将事件传递给一个函数。

(这样用户可以选择一个小部件来执行元操作。部分解释在这里:Get variable name of Qt Widget (for use in Stylesheet)?)

用户会通过点击来选择一个小部件(用来做一些事情),当然点击一个按钮不能导致按钮的绑定函数运行。

这样做的正确(最抽象、最明智)的方法是什么? (这不涉及太多新代码。即;不继承每个小部件) Qt 中有什么为此设计的吗?

到目前为止,我能够检索程序中所有小部件的列表(通过调用

QObject.findChildren(QtGui.QWidget)

所以解决方案可以包含这个。

我目前的可怕想法是;

如何处理所有的应用程序事件在一个时间 发挥作用,在我需要的时候不让事件发生 应用程序处于休眠状态。 当我需要休眠时,制作一个新的透明小部件以接收 单击鼠标并将其拉伸到整个窗口。取坐标 点击并找出下面的小部件。 以某种方式创建窗口的新“外壳”实例。

谢谢! (抱歉写得这么糟糕;有点匆忙)


python 2.7.2 PyQt4 视窗 7

【问题讨论】:

【参考方案1】:

您可以使用QObject::installEventFilter 拦截发送到特定小部件的事件。

【讨论】:

这正是解决方案。如果您想“窃取”所有事件,请在 qApp 上放置一个事件过滤器,它会阻止任何孩子接收它们。 事件过滤什么也没做。即使所有事件都被忽略,单击按钮仍会运行函数! (除非我很愚蠢,不知道自己在做什么;真的) 如果您想停止进一步处理事件,请确保您从 eventFilter() 返回 true。此外,过滤所有事件是一个非常糟糕的主意——只过滤用户输入。实现这一点的更直接的方法是在***小部件上调用 setEnabled(false)。【参考方案2】:

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。谢谢!

以上是关于Qt - 暂时禁用所有事件或窗口功能?的主要内容,如果未能解决你的问题,请参考以下文章

QT中父窗口响应子窗口动作

QT开发_弹出窗口禁用父窗口并移动到父窗口中心位置

Qt中怎样阻塞父窗口部分控件,而不完全阻塞父窗口所有控件??

qt大小变化事件和show的先后顺序

可能的 Qt5 错误:调用 setFixedSize() 会禁用主窗口的关闭按钮(在 Win7 下)

QT窗口拖拽功能简单应用(处理dragEnterEvent和dropEvent事件,不同的事件有不同的信息,比如mimeData)