2012-01-25 78 views
1

我有一个Qt程序,包含许多按钮,用户可交互的小部件等。
在程序的一个阶段,我希望所有的小部件暂时“停止工作”。停止表现为鼠标点击,而是将事件传递给一个函数。Qt - 暂时禁用所有事件或窗口功能?

(这是为了让用户可以选择一个小部件来执行元操作部分说明这里:Get variable name of Qt Widget (for use in Stylesheet)?

用户会选择一个小部件(做的东西),通过点击它,当然点击按钮不得导致按钮的绑定功能运行。

这样做的正确(最抽象的,明智的)方法是什么? (这不涉及太多的新代码,即;不是每个部件的子类)
Qt为此设计了什么?

到目前为止,我能够(通过调用

QObject.findChildren(QtGui.QWidget) 

因此该解决方案可以将这个检索程序中所有的小部件列表

我目前的可怕想法。

  • 一些如何在一个 函数中始终处理所有应用程序事件,并且在我需要 应用程序时不通过事件离子被休眠。
  • 当我需要休眠时,制作一个新的透明窗口小部件,它接收鼠标点击并在整个窗口上拉伸。点击坐标 ,找出下面的小部件。
  • 以某种方式创建窗口的新“壳”实例。

谢谢!
(对不起,可怕的评论;在轻微抢)


蟒蛇2.7.2
PyQt4的
Windows 7的

回答

2

你可以拦截事件发送到特定的部件与QObject::installEventFilter

+0

这也正是该解决方案。如果你想'窃取'所有事件,在qApp上放置一个事件过滤器,它会阻止任何孩子接收它们。 – synthesizerpatel

+0

事件过滤什么也没做。即使所有事件都被忽略,点击按钮仍然会运行这些功能!(除非我很蠢,不知道我在做什么;是的) –

+1

如果你想停止进一步处理的事件,确保你从eventFilter()返回true。而且,过滤所有事件是一个非常糟糕的主意 - 只过滤用户输入。一个更直接的方法是在顶级小部件上调用setEnabled(false)。 –

1

石墨石墨首先回答这个问题,所以在信贷到期时给予信贷。

对于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) 
+0

不太了解类的结构。 (你如何拥有ignore_input的属性?你没有KeyPressEater的构造函数)。尽管如此,我一定会关注eventFilter。谢谢! –