PyQt: почему всплывающее диалоговое окно препятствует выполнению другого кода? - PullRequest
2 голосов
/ 11 декабря 2011

У меня небольшая проблема с всплывающим диалоговым окном. У меня есть поле со списком, которое при изменении параметра вызывает диалоговое окно с виджетом textedit, делает некоторые вещи и вставляет текст в виджет textedit.

Это то, что я использую для всплывающего окна:

def function_1(self):
    dialog = QDialog()
    dialog.ui = Ui_Dialog_popup()
    dialog.ui.setupUi(dialog)
    dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
    dialog.exec_()

У меня есть всплывающий код GUI, созданный в QtDesignere в отдельном файле py.

Появляется всплывающее диалоговое окно, но если оно не закрыто, больше ничего не может быть выполнено. Знаете, как я могу с этим справиться? Спасибо.

Ответы [ 3 ]

5 голосов
/ 11 декабря 2011

Это именно то, для чего предназначен exec метод QDialog: модальные диалоги. Прочитайте разделы «Модальный» и «Немодальный диалог».

Если у вас нет диалогового окна для блокировки основного пользовательского интерфейса, вызовите show() вместо exec() (и проверьте документацию свойства modal).

1 голос
/ 11 декабря 2011

Подробно о том, что сказал Мат: функция show () немедленно возвращается, и, поскольку диалог является локальным для этой функции, объект удаляется, как только возвращается «function_1». Возможно, вы захотите сделать диалог участником или глобальным (в зависимости от ваших требований), чтобы объект оставался в памяти.

НТН

0 голосов
/ 11 декабря 2011

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

Если это так, самый простой способ решить вашу проблему (на основе кода, который вы дали), это дать вашему диалогу родительский элемент (чтобы он оставался в живых), а затем отобразить его немодально , используя show():

def function_1(self):
    dialog = QDialog(self)
    dialog.ui = Ui_Dialog_popup()
    dialog.ui.setupUi(dialog)
    dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
    dialog.show()
...