簡體   English   中英

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

[英]Proper way to quit/exit a PyQt program

我有一個腳本,它有一個登錄屏幕,如果按下取消按鈕,我想完全退出應用程序。 我嘗試了 3 種方法:

  1. 系統退出()
  2. QApplication.quit()
  3. QCoreApplication.instance().quit()

只有 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_())

調用QCoreApplication.quit()與調用QCoreApplication.exit(0) 引用qt 文檔

調用此函數后,應用程序離開主事件循環並從對 exec() 的調用返回。 exec() 函數返回returnCode 如果事件循環沒有運行,這個函數什么都不做 [強調]

所以quit()exit()sys.exit() 后者將終止程序,但前者只會終止事件循環(如果它正在運行)。

當用戶取消登錄對話框時,您的示例應該只調用sys.exit()來終止程序。 否則,您的程序將卡在阻塞的 while 循環中。

而不是使用QApplication.quit() ,因為你定義了app = QApplication(sys.argv) ,你可以只寫app.quit() ,這應該可行!

一些無關但可能有用的東西:我認為如果您將登錄檢查放在Ci_Co類的__init__函數的開頭會更容易。 這樣,您將在開始時啟動Ci_Co ,但它會首先生成Login類。 如果登錄失敗,您可以調用app.quit() ,如果成功,它會自動過渡到Ci_Co 這使您免於在if __name__ == "__main__"子句中編寫許多內容。 如果您還有任何問題,請發表評論,我有一個帶有登錄對話框的類似項目。

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

我嘗試這 3 種方法來關閉我的MainWindow()但它對我的代碼不起作用。

  1. 系統退出()
  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM