Anti Earth
Anti Earth

Reputation: 4816

Qt - Temporarily disable all events or window functionality?

I have a Qt program with many buttons, user-interactable widgets, etc.
At one stage in the program, I would like all the widgets to temporarily 'stop working'; stop behaving to mouse clicks and instead pass the event on to one function.

(This is so the User can select a widget to perform meta operations. Part explanation here: Get variable name of Qt Widget (for use in Stylesheet)? )

The User would pick a widget (to do stuff with) by clicking it, and of course clicking a button must not cause the button's bound function to run.

What is the correct (most abstracted, sensible) method of doing this?
(which doesn't involve too much new code. ie; not subclassing every widget)
Is there anything in Qt designed for this?

So far, I am able to retrieve a list of all the widgets in the program (by calling

QObject.findChildren(QtGui.QWidget)

so the solution can incorporate this.

My current horrible ideas are;

THANKS!
(Sorry for the terrible write-up; in a slight rush)


python 2.7.2
PyQt4
Windows 7

Upvotes: 3

Views: 5695

Answers (2)

synthesizerpatel
synthesizerpatel

Reputation: 28056

graphite answered this one first so give credit where credit is due.

For an actual example in PySide, here's an example you might draw some useful code from:

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)

Upvotes: 1

graphite
graphite

Reputation: 2960

You can intercept events send to specific widgets with QObject::installEventFilter.

Upvotes: 4

Related Questions