Qt - 暂时禁用所有事件或窗口功能?
我有一个Qt程序,里面有很多按钮和用户可以互动的控件等。
在程序的某个阶段,我想让所有的控件暂时“停止工作”;也就是不响应鼠标点击,而是把这些事件传递给一个特定的函数。
(这样用户就可以选择一个控件来进行一些特殊操作。这里有部分解释:获取Qt控件的变量名(用于样式表)?)
用户通过点击某个控件来选择要操作的对象,当然,点击按钮时不能让按钮绑定的函数执行。
那么,正确的(最简单、最合理的)做法是什么呢?
(希望不要涉及太多新的代码,比如不想为每个控件都创建子类)
Qt里有没有什么是专门为这个设计的?
到目前为止,我已经能获取程序中所有控件的列表(通过调用
QObject.findChildren(QtGui.QWidget)
所以解决方案可以结合这个。
我现在的一些糟糕想法是:
- 想办法在一个函数里处理所有应用程序的事件,并在需要应用程序“休眠”时不让事件通过。
- 在需要“休眠”时,创建一个新的透明控件,接收鼠标点击,并把它拉伸到整个窗口上。记录点击的坐标,然后找出下面的控件。
- 想办法创建一个新的“外壳”窗口实例。
谢谢!
(抱歉写得很糟糕;有点赶)
python 2.7.2
PyQt4
Windows 7
2 个回答
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)
4
你可以通过 QObject::installEventFilter 来拦截发送到特定小部件的事件。