Приложение вылетает при использовании QWidgets.QMessageBox - PullRequest
0 голосов
/ 16 мая 2018

Итак, я пытался с PyQT5 попытаться создать графический интерфейс для приложения, над которым я работал.

Я столкнулся с проблемой с функцией QMessageBox.

Я пытался создать действие «Выход» на панели меню приложения. И сначала я только сделал это, когда нажал, и это работало.

Теперь я хочу, чтобы он выдал всплывающее сообщение «Вы уверены?», Что именно и делает QMessageBox. Так вот мой код:

class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.ui = uic.loadUi('rent_creation.ui', self)
        self.home()

    def home(self):
        self.ui.actionExit.triggered.connect(self.close_application)
        self.show()


    def close_application(self):
        choice = QMessageBox.question(self, 'Quit?',
                                      "Are you sure you want to quit?",
                                      QMessageBox.Yes | QMessageBox.No)
        if choice == QMessageBox.Yes:
            sys.exit()
        else:
            pass

Теперь каждый раз, когда я нажимаю кнопку «Выход» при запуске этого кода, происходит сбой Python. Я не уверен, что я делаю неправильно ... Я искал в Интернете, и все это выглядит хорошо ... Я перепробовал все возможные варианты прохождения QmessageBox (например, я пытался добавить QWidgets. QMessageBox.Yes / No, и это не решило эту проблему).

Я следил за учебником в интернете, где этот код практически такой же, как у него, и он как-то работает для него в учебнике.

1 Ответ

0 голосов
/ 16 мая 2018

Предостережение: я нахожусь на linux, поэтому, скорее всего, все немного по-другому.

Однако я не удивлюсь, если проблема связана с тем, что вы используете sys.exit для выхода из графического интерфейса.Возможно, вам следует аккуратно закрыть окно QApplication и затем выйти из программы.

Следующий пример может решить вашу проблему.Поскольку у меня нет вашего пользовательского файла, я просто добавил действие меню, чтобы закрыть окно и связать его со слотом QMainWindow.close, а затем переопределить метод closeEvent.См. Комментарии в коде:

import sys
from PyQt5 import QtWidgets


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

    def home(self):
        # add a menu bar with a File menu and a Close action
        menu_bar = QtWidgets.QMenuBar(self)
        menu = QtWidgets.QMenu('File', menu_bar)
        menu_bar.addMenu(menu)
        action = menu.addAction('Close')

        # connect the Close action with the QMainWindow.close slot
        action.triggered.connect(self.close)

        self.setMenuBar(menu_bar)

     def closeEvent(self, event):
        """override the QMainWindow.closeEvent method to:

        * fire up a QMessageBox with a question
        * accept the close event if the user click yes
        * ignore it otherwise.

        Parameters
        ----------
        event : QtCloseEvent
            emitted when someone or something asks to close the window
        """
        if self.ask_quit():
            event.accept()
        else:
            event.ignore()

    def ask_quit(self):
        choice = QtWidgets.QMessageBox.question(self, 'Quit?',
                        "Are you sure you want to quit?",
                        QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
        return choice == QtWidgets.QMessageBox.Yes


if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)

    w = Window()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Simple')
    w.show()

    sys.exit(app.exec_())

Описанный выше способ закрытия окна, т. Е. Использование closeEvent и подключение действия меню к close, имеет то преимущество, что окно подтверждения открывается каждый раз.время, когда кто-то просит закрыть окно, независимо от метода: вы получаете окно сообщения, также нажимая на кнопку X окна или alt+F4


Редактировать: пример того, как правильно закрыть окноQApplication только из меню Close.Это должно более соответствовать исходному поведению приложения в вопросе (см. Комментарий).

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

    def home(self):
        menu_bar = QtWidgets.QMenuBar(self)

        menu = QtWidgets.QMenu('File', menu_bar)
        menu_bar.addMenu(menu)

        action = menu.addAction('Close')
        # connect the Close menu to the ``ask_quit`` slot to ask and exit the
        # application on "yes"
        action.triggered.connect(self.ask_quit)

        self.setMenuBar(menu_bar)

    def closeEvent(self, event):
        """Ignore all ways of closing"""
        event.ignore()

    @QtCore.pyqtSlot()
    def ask_quit(self):
        choice = QtWidgets.QMessageBox.question(self, 'Quit?',
                        "Are you sure you want to quit?",
                        QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
        if choice == QtWidgets.QMessageBox.Yes:
            QtWidgets.QApplication.quit()
...