我是 PyQt 的新手,试图开发简单的应用程序。我用 Qt-designer 设计了简单的 ui。如果用户真的想在单击 X 或 ,,Exit'' 按钮或从菜单中选择退出时退出应用程序,我需要额外的确认。
这是代码:
import sys
from PyQt4 import QtGui, QtCore, uic
class MainWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.ui = uic.loadUi('main_window.ui')
self.ui.show()
self.ui.btnExit.clicked.connect(self.close)
self.ui.actionExit.triggered.connect(self.close)
def closeEvent(self, event):
print("event")
reply = QtGui.QMessageBox.question(self, 'Message',
"Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes:
event.accept()
else:
event.ignore()
def main():
app = QtGui.QApplication(sys.argv)
win = MainWindow()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
问题在于:
被调用,但单击是不会关闭应用程序。
我在 SO 上发现了一些问题并搜索了教程,但没有涵盖此类问题。我究竟做错了什么?
最佳答案
请注意,您正在执行以下操作:
self.ui = uic.loadUi('main_window.ui')
self.ui.show()
您的实际窗口是
ui
内的实例属性( win
)。不是 win
本身。它没有实现 closeEvent
。loadUi
可以在实例中加载 .ui
文件。PyQt4.uic.loadUi(uifile[, baseinstance=None[, package='']])
你应该用那个。这样,您的代码将是:
import sys
from PyQt4 import QtGui, QtCore, uic
class MainWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
uic.loadUi('main_window.ui', self)
self.btnExit.clicked.connect(self.close)
self.actionExit.triggered.connect(self.close)
def closeEvent(self, event):
print("event")
reply = QtGui.QMessageBox.question(self, 'Message',
"Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes:
event.accept()
else:
event.ignore()
def main():
app = QtGui.QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
注意:我不是
show
窗口的粉丝 __init__
。明确的更好。所以,我把它移到了 main
。随意修改它。关于python - PyQt:单击 X 不会触发 closeEvent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14834494/