因此,我一直在尝试使用PyQT5来为我一直在努力的应用程序提供GUI。
我遇到了QMessageBox功能的问题。
我一直试图创造一个"退出"应用程序的MenuBar上的操作。 最初我只是在点击时退出它并且有效。
现在我想让它给出一个弹出的消息"你确定吗?",这正是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并且它没有修复此问题。)
我一直在关注互联网上的教程,其中这段代码几乎与他的相同,并且它在教程中以某种方式适用于他。
答案 0 :(得分:1)
但是,如果问题与您使用sys.exit
退出GUI这一事实有关,我不会感到惊讶。您可能应该干净地关闭窗口QApplication
,然后退出程序。
以下示例可能会解决您的问题。由于我没有ui文件,我只是添加了一个菜单操作来关闭窗口并将其与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()