我有一个带有登录屏幕的脚本,如果按下取消按钮,我想完全退出应用程序。我尝试了3种方法:
只有 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()
,这样就可以了!
一些不相关但可能有用的东西:我认为如果将登录检查放在
__init__
类的 Ci_Co
函数的开头会更容易。这样,您将从一开始就启动 Ci_Co
,但它首先会生成 Login
类。如果登录失败,可以调用app.quit()
,如果成功,会自动跳转到Ci_Co
。这使您无需在 if __name__ == "__main__"
子句中编写许多内容。如果您还有任何问题,请评论,我有一个带有登录对话框的类似项目。
我尝试了这 3 种方法来关闭我的
MainWindow()
但它对我的代码不起作用。
所以我使用
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
你可以使用这个方法:
def 退出(自身): QApplication.instance().quit() 并在构造函数 def init 中调用它 像这样: self.your_button_name.clicked.connect(self.exit) 或者 self.your_button_name.clicked.connect(self.close)