Qt - Временно отключить все события или функциональность окна? - PullRequest
1 голос
/ 25 января 2012

У меня есть программа Qt со многими кнопками, интерактивными виджетами и т. Д.
На одном этапе программы я бы хотел, чтобы все виджеты временно «перестали работать»; перестаньте реагировать на щелчки мышью и вместо этого передайте событие одной функции.

(Это значит, что пользователь может выбрать виджет для выполнения мета-операций. Объяснение части здесь: Получить имя переменной Qt Widget (для использования в таблице стилей)? )

Пользователь выбирает виджет (для работы с ним), щелкая его, и, конечно, нажатие кнопки не должно приводить к запуску функции привязки кнопки.

Каков правильный (самый абстрактный, разумный) способ сделать это?
(который не требует слишком много нового кода. т.е. не разбивает на подклассы каждый виджет)
Есть ли в Qt что-нибудь для этого?

Пока я могу получить список всех виджетов в программе (вызывая

QObject.findChildren(QtGui.QWidget)

чтобы решение могло включать это.

Мои нынешние ужасные идеи таковы;

  • Кое-как, как обрабатывать все события приложений все время в одном функция и не пропуская события, когда мне нужно заявка на бездействие.
  • Когда мне нужно покой, создайте новый прозрачный виджет, который получает щелкнуть мышью и растянуть его по всему окну. Взять координаты нажмите и выясните виджет внизу.
  • Каким-то образом создайте новый экземпляр 'shell' окна.

СПАСИБО!
(Извините за ужасную переписку; в небольшом порыве)


Python 2.7.2
PyQt4
Windows 7

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Вы можете перехватывать события, отправляемые определенным виджетам, с помощью QObject :: installEventFilter .

1 голос
/ 25 января 2012

графит ответил на этот вопрос первым, так что отдавайте должное.

Для фактического примера в 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)
...