В моем приложении на основе 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 )