退出/退出PyQt程序的正确方法

时间:2016-07-09 16:05:24

标签: python pyqt pyqt5

我有一个具有登录屏幕的脚本,如果按下取消按钮,我想完全退出应用程序。我试过3种方法:

  1. sys.exit()
  2. QApplication.quit()
  3. QCoreApplication.instance()。quit()
  4. 只有1号才有效。另外两个使对话框变白,然后闪烁然后挂起,我甚至无法切换到其他应用程序。我的代码如下:

    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtSql import *
    from PyQt5.QtWidgets import *
    
    
    import csv
    import sys
    from datetime import datetime, timedelta, time
    import os
    
    from ci_co_table import *
    from login import *
    
    class Ci_Co(QMainWindow):
        """Check in and check out module"""
    
        def __init__(self, parent=None):
            QWidget.__init__(self, parent)
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
    
    class Login(QDialog):
        """User login """
        def __init__(self):
            QDialog.__init__(self)
            self.ui = Ui_login_form()
            self.ui.setupUi(self)
            self.ui.buttonBox.accepted.connect(lambda: self.handle_login(servers=servers))
            servers = {}
            with open('servers.csv', newline='') as csvfile:
                server_reader = csv.reader(csvfile)
                for row in server_reader:
                    self.ui.cbo_db_name.addItem(row[1])
                    servers[row[1]] = (row[0],row[2])
    
        def handle_login(self, servers=''):
            global user
            global pword
            global database
            global server
            global bg_colour
            user = self.ui.username.text()
            pword = self.ui.password.text()
            database = self.ui.cbo_db_name.currentText()
            server = servers[database][0]
            bg_colour = servers[database][1]
    
    
    if __name__=="__main__":
        app=QApplication(sys.argv)
        global hotdate
        global hotdate_string
        global folio_num
        global user
        global pword
        global dbase
        global server
        pword = ""
        global database
        global bg_colour
        #Login
        while True:
            if Login().exec_() == QDialog.Accepted:
                db = QSqlDatabase.addDatabase("QPSQL");
                db.setHostName(server)
                db.setDatabaseName(database);
                db.setUserName(user);
                db.setPassword(pword)
                if (db.open()==False):     
                    QMessageBox.critical(None, "Database Error", db.lastError().text())
                else:
                    break
            else:
                #QApplication.quit()
                QCoreApplication.instance().quit()            
                #sys.exit()
    
    
        myapp = Ci_Co()
        myapp.show()
        sys.exit(app.exec_())
    

4 个答案:

答案 0 :(得分:10)

致电QCoreApplication.quit()与致电QCoreApplication.exit(0)相同。引用qt docs

  

调用此函数后,应用程序将离开main   事件循环并从对exec()的调用返回。 exec()函数   返回 returnCode 如果事件循环未运行,则此功能   什么都不做。 [强调补充]

所以quit()exit()sys.exit()完全不同。后者将终止程序,但前者只会终止事件循环(如果它正在运行)。

当用户取消登录对话框时,您的示例应该只是调用sys.exit()来终止程序。否则,你的程序将陷入阻塞的while循环中。

答案 1 :(得分:2)

由于您定义了$url=~/\/([^\/]+)$/; print "Filename $1\n"; ,因此您可以只编写QApplication.quit(),而不是使用app = QApplication(sys.argv),这应该有效!

某些不相关但可能有帮助的东西:我认为如果您将登录检查放在app.quit()类的__init__函数的开头会更容易。这样,您将从头开始Ci_Co,但它将首先生成Ci_Co类。如果登录失败,您可以致电Login,如果成功,它将自动转换为app.quit()。这样可以避免您在Ci_Co子句中编写的许多内容。如果您还有其他问题请评论,我有一个类似的项目,带有登录对话框。

答案 2 :(得分:0)

sys.exit(app.exec_()) 添加到您的代码中

答案 3 :(得分:0)

我尝试了这 3 种方法来关闭我的 MainWindow(),但它对我的代码不起作用。

  1. sys.exit()
  2. QApplication.quit()
  3. qApp.quite()

所以我使用 self.close() 方法,它与我的代码完全一致。

这是我的代码

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
    
        self.ui.QPushButton.clicked.connect(lambda: self.shutprocess())
    
    def shutprocess(self):
        reply = QMessageBox.question(self, 'Window Close', 'Are you sure you want to close the window?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)

        if reply == QMessageBox.Yes:
                self.close()
            print('Window closed')
        else:
            pass