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

3 投票
2 回答
5275 浏览
提问于 2025-04-17 11:02

我有一个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 来拦截发送到特定小部件的事件。

撰写回答