PyQt5 Заставить QDialog дождаться завершения процесса до sh, прежде чем разрешить ввод пользователя - PullRequest
0 голосов
/ 16 марта 2020

После поиска в течение некоторого времени и получения многих результатов для PyQt4 я не смог преобразовать себя, мне нужна помощь для окна состояния, в котором нуждается мое приложение.

Окно открывается, когда процесс запускается и должен не разрешать дальнейший ввод пользователем в основной файл GUI, также пользователи не должны иметь возможность закрыть его, пока процесс не будет завершен и не будет нажата кнопка закрытия.

Я пробовал это с QDialog и опускаю до сих пор кадр (все еще нужно поймать клавишу 'ES C'), но я убежден, что есть лучшее решение. Мой код:

def resultWindow(self):
    self.resultBox = QDialog(self)
    self.resultBox.setWindowTitle("Please Wait")

    self.OkButton = QtWidgets.QPushButton(self.resultBox)
    self.OkButton.setText("Ok")
    self.OkButton.setEnabled(False)
    self.OkButton.clicked.connect(self.OkButton_clkd)
    self.resultBox.setWindowFlags(QtCore.Qt.CustomizeWindowHint | QtCore.Qt.FramelessWindowHint | QtCore.Qt.Tool)
    self.resultBox.exec_()

def OkButton_clkd(self):
    self.resultBox.close()

Итак, как же это сделать умнее?

1 Ответ

1 голос
/ 16 марта 2020

Вместо полного удаления рамки, которая также не позволяет пользователю перемещать или изменять размер диалогового окна, вы можете просто удалить кнопку закрытия из строки заголовка, выполнив что-то вроде

self.resultBox.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.WindowStaysOnTopHint| 
                              QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowTitleHint)

, чтобы поймать выход Клавиша для диалога вы можете установить фильтр событий, например,

def resultWindow(self):
    self.resultBox = QtWidgets.QDialog(self)
    self.resultBox.installEventFilter(self)
    ....

def eventFilter(self, object, event):
    if (object == self.resultBox and 
            event.type() == QtCore.QEvent.KeyPress and 
            event.key() == Qt.Key_Escape):
        return True
    return super().eventFilter(object, event)

или вы можете создать подкласс QDialog и переопределить keyPressEvent()

...