Заблокировать и скрыть QDialog: Альтернатива exec_ ()? - PullRequest
1 голос
/ 30 ноября 2011

В моем приложении на основе Qt (построенном с использованием PyQt 4.8.6) у меня есть класс, который является подклассом QtGui.QDialog:

class ModelDialog(QtGui.QDialog):
    ...

Когда я запускаю пользовательский интерфейс приложения, я могу отобразить QDialog следующим образом:

def main():
    app = QtGui.QApplication(sys.argv)
    dialog = ModelDialog()
    dialog.exec_()

В соответствии с Qt docs и PyQt docs , exec_() является функцией блокировки для этого QDialog, по умолчанию используется модальное окно (которое по определению не позволяет пользователю взаимодействие с любыми другими окнами в приложении). Это именно то, что происходит при нормальных обстоятельствах.

Однако недавно я работал над способом вызова всей QApplication, используя значения по умолчанию для всех входных значений и не спрашивая пользователя о каких-либо входных данных. Приложение ведет себя так, как и ожидалось, за исключением одного аспекта: вызов dialog.exec_() приводит к отображению модального диалога.

Единственный обходной путь, который мне удалось найти, - это перехватить функцию showEvent и быстро скрыть окно, но это все же позволяет отображать объект QDialog в течение доли секунды:

class ModelDialog(QtGui.QDialog):
    ...
    def showEvent(self, data=None):
        self.hide()

Можно ли вообще запретить показ модального окна, продолжая блокировать основной цикл событий? Я бы хотел, чтобы там было что-то вроде:

def main():
    app = QtGui.QApplication(sys.argv)
    dialog = ModelDialog()
    dialog.setHideNoMatterWhat(True)
    dialog.exec_()

(для этого я попытался использовать QWidget.setVisible(False), но dialog.exec_() в любом случае устанавливает диалоговое окно, которое будет отображаться в соответствии с Qt docs )

1 Ответ

2 голосов
/ 30 ноября 2011

Используйте app.exec_() вместо dialog.exec_().

...