I’m a total newbie in PyQt trying to develop simple application. I have designed simple ui with Qt-designer. I want extra confirmation if the user really want to exit application when clicking X or ,,Exit” button or choosing Exit from menu.
Here’s the code:
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()
The problem is that:
- When I click X on main window the closeEvent function doesn’t trigger
- When I click Exit button or choose ,,Exit” from menu, the function
is called, but clicking Yes doesn’t close application.
I have found some questions on SO and searched for tutorials, but nothing covered such problem. What am I doing wrong?
Note that you’re doing:
Your actual window is an instance attribute (
ui) insidewin. Not thewinitself. And it doesn’t havecloseEventimplemented.loadUican load the.uifile inside an instance.You should use that. With that, your code would be:
Note: I’m not a fan of
showing the window in__init__. Explicit is better. So, I moved that tomain. Feel free to modify it.