2017-02-13 12 views
0

В PyQt5, и я верю задним числом, по крайней мере, до 4, если QMessageBox инициализирован с MainWindow в качестве родителя, он заблокирует любой вход в MainWindow до тех пор, пока MessageBox не будет принят, закрыт и т. Д. ...PyQt5 получить QErrorMessage для блокировки Mainwindow

Однако, если вы инициализировать QErrorMessage используя MainWindow в качестве родителя такое поведение не происходит. Есть ли способ передать какой-то параметр окна в QErrorMessage таким образом, чтобы он блокировал родительское окно до его закрытия?

n.b. Я понимаю, что могу заставить QMessageBox вести себя и выглядеть как QErrorMessage. Я просто хотел бы знать, возможно ли описанное выше поведение.

+0

, как QMessageBox наследует QDialog, вы можете попытаться установить 'setModal (True) 'иметь ожидаемое поведение. Вы также можете попробовать запустить 'QErrorMessage' с' .exec _() '. Оба должны работать в вашем случае. – SyedElec

+0

@SyedElec я использовал '.exec _()', поэтому я был удивлен. – Grr

+0

Вы пытались заставить модальность диалога с помощью 'setModal (True)'? 'exec _()' должен делать трюк, если вы не изменили модальность диалога, используя 'setWindowModality()'. Можете ли вы показать простой пример? – SyedElec

ответ

1

Установите ваш QErrorMessage как модальный с помощью setWindowModality(QtCore.Qt.WindowModal)

from PyQt5 import QtCore, QtWidgets 

class MainWindow(QtWidgets.QMainWindow): 
    def __init__(self): 
     super(MainWindow, self).__init__() 

     emsg = QtWidgets.QErrorMessage(self) 
     emsg.setWindowModality(QtCore.Qt.WindowModal) 

     cwidget = QtWidgets.QWidget() 
     layout = QtWidgets.QVBoxLayout(cwidget) 
     lineedit = QtWidgets.QLineEdit() 
     button = QtWidgets.QPushButton('Show message') 
     button.clicked.connect(lambda: emsg.showMessage('Message: ' + lineedit.text())) 
     layout.addWidget(lineedit) 
     layout.addWidget(button) 
     self.setCentralWidget(cwidget) 


app = QtWidgets.QApplication([]) 
win = MainWindow() 
win.show() 
app.exec_() 
+0

Так что я попытался как 'setModal (True) и' setWindowModality (QtCore.Qt.WindowModal) 'и ни работал. Возможно ли, что это результат чего-то неправильно установленного на главном экране? К сожалению, я пытаюсь очистить чужой проект, поэтому я не совсем уверен в настройках в классе 'Ui_MainWindow'. – Grr

+0

Приведенный выше пример работает для вас? Убедитесь, что 'MainWindow' назначен родителем вашего' QMessageBox' или он не будет блокироваться. Я не уверен, что какие-либо настройки в «MainWindow» могут повлиять на это поведение. – user3419537

+0

Все мужчины, так немой. Ваш код работал, и я понял, что случилось. Я вызывал 'showMessage()' перед установкой модальности. Я не понимал, что 'showMessage()' также вызывал 'show()', хотя я должен был так много понимать от имени. Мой заказ был 'showMessage()', 'setModal()', после чего вызывал либо show() ', либо' exec _() '. – Grr

 Смежные вопросы

  • Нет связанных вопросов^_^