如果用户拒绝配置对话框,请关闭pyqt5应用

时间:2016-02-17 06:49:02

标签: python python-3.x pyqt pyqt5

我正在尝试创建一个与Yandex磁盘API(云端存储)进行交互的应用,但设置窗口失败了。

以下是设置对话框:

class SettingsUI(QDialog, Ui_Dialog):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.settings = QSettings('settings.ini', QSettings.IniFormat)

        self.toolButton.clicked.connect(lambda:self.lineEdit_watcher_folder.setText(QFileDialog.getExistingDirectory()))

    def isFirstRun(self):
        return True if self.settings.value('first_run') is None else False

    def getAPIKey(self):
        return self.settings.value('api_key')

    def getFolder(self):
        return self.settings.value('folder')

    def getWhitelistExtensions(self):
        return self.settings.value('files_extension')

    def getMailError(self):
        return self.settings.value('mail_error')

    def accept(self):
        if not self.lineEdit_API.text():
            QMessageBox.critical(self, 'Ошибка', 'Укажите API ключ для доступа к Yandex API')
        elif not self.lineEdit_watcher_folder.text() or not os.path.isdir(self.lineEdit_watcher_folder.text()):
            QMessageBox.critical(self, 'Ошибка', 'Укажите папку с файлами для загрузки')
        elif not self.lineEdit_allowed_ext.text():
            QMessageBox.critical(self, 'Ошибка', 'Не указаны форматы файлов')
        else:
            self.settings.setValue('first_run', False)
            self.settings.setValue('api_key', self.lineEdit_API.text())
            self.settings.setValue('folder', self.lineEdit_watcher_folder.text())
            self.settings.setValue('files_extension', tuple(self.lineEdit_allowed_ext.text().split(';')))
            self.settings.setValue('mail_error', self.lineEdit_mail_error.text())

            super().accept()

这是主要代码:

class MainUI(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.setupTopMenu()
        self.firstRun()
        self.show()

    def setupTopMenu(self):
        self.settingsDialog = SettingsUI()
        self.settings_menu.triggered.connect(self.settingsDialog.exec)
        self.quit_menu.triggered.connect(self.shutdown)

    def shutdown(self):  # TODO method for correctly shutdown threads
        # sys.exit()
        qApp.quit()  

    def firstRun(self):
        if self.settingsDialog.isFirstRun():
            if self.settingsDialog.exec() == QDialog.Rejected:
                self.shutdown()


class WorkerNewTask(QObject):...


class WorkerYandexArchive(QObject):...


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_ui = MainUI()
    # main_ui.show()
    sys.exit(app.exec())

如果用户在第一次运行中取消设置窗口但是当解释器在shutdown方法中到达qApp.quit()时,我想关闭应用程序,该应用程序仍在工作。

同时如果我点击顶部菜单中的quit_menu按钮,它连接到关机方法,它就会关闭app。

如果有人能告诉我我做错了什么,我会很高兴:)。 亲切的问候,Maxim

2 个答案:

答案 0 :(得分:1)

我认为原因是应用程序尚未完全初始化。请注意调用链:MainUI() -> MainUI.__init__() -> MainUI.first_run() -> MainUI.settingsDialog.exec() -> MainUI.shutdown() -> qApp.quit()。但是,在脚本的__name__ == '__main__'部分,代码将继续app.exec()。因此,当app被调用时,quit()可能尚未初始化。

答案 1 :(得分:0)

执行此操作的方法是关闭窗口并在最后一个窗口关闭时将应用程序设置为关闭

def shutdown(self):
    QApplication.instance().setQuitOnLastWindowClosed(True)
    self.close()