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中怎样阻塞父窗口部分控件,而不完全阻塞父窗口所有控件??
可能的 Qt5 错误:调用 setFixedSize() 会禁用主窗口的关闭按钮(在 Win7 下)
QT窗口拖拽功能简单应用(处理dragEnterEvent和dropEvent事件,不同的事件有不同的信息,比如mimeData)