Okay, not sure what I am missing here. I have created a GUI app for work, which contains a close button. I am able to get the closeEvent function to execute, if the user uses the custom window close button. However, when they click the close button on the GUI, I can't produce the same effect. Below is my code, the error and a picture of my GUI demonstrating my issue. Thanks in advance for the help.
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'icMainWin.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import icMainWin_rc
import sys
import os
import time
import os.path as osp
import ctypes
from ctypes import wintypes
import os
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
#setting the path variable for icon
path = osp.join(osp.dirname(sys.modules[__name__].__file__), 'I:\\Infection Control System Database\images\Malware-icon.png')
myappid = 'I:\\Infection Control System Database\images\Malware-icon.png' # arbitrary string
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
lpBuffer = wintypes.LPWSTR()
AppUserModelID = ctypes.windll.shell32.GetCurrentProcessExplicitAppUserModelID
AppUserModelID(ctypes.cast(ctypes.byref(lpBuffer), wintypes.LPWSTR))
appid = lpBuffer.value
ctypes.windll.kernel32.LocalFree(lpBuffer)
if appid is not None:
print(appid)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(905, 675)
MainWindow.setMinimumSize(QtCore.QSize(905, 675))
MainWindow.setMaximumSize(QtCore.QSize(905, 680))
font = QtGui.QFont()
font.setBold(False)
font.setWeight(50)
MainWindow.setFont(font)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(_fromUtf8("I:\Infection Control System Database\Program Files\images\ICDatabaseImage.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
Code Truncated for Posting
self.retranslateUi(MainWindow)
QtCore.QObject.connect(self.actionExit, QtCore.SIGNAL(_fromUtf8("triggered()")), self.btnExit.click)
QtCore.QObject.connect(self.actionWar_Room, QtCore.SIGNAL(_fromUtf8("triggered()")), self.cmdWarRoom.click)
QtCore.QObject.connect(self.actionFlu, QtCore.SIGNAL(_fromUtf8("triggered()")), self.btnFlu.click)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
MainWindow.setTabOrder(self.btnExit, self.btnHelp)
MainWindow.setTabOrder(self.btnHelp, self.btnRequest)
MainWindow.setTabOrder(self.btnRequest, self.btnSOR_IFMC)
MainWindow.setTabOrder(self.btnSOR_IFMC, self.btnSOR_IAH)
MainWindow.setTabOrder(self.btnSOR_IAH, self.btnSOR_ILH)
MainWindow.setTabOrder(self.btnSOR_ILH, self.btnSOR_IMVH)
MainWindow.setTabOrder(self.btnSOR_IMVH, self.btnSOR_IFOH)
MainWindow.setTabOrder(self.btnSOR_IFOH, self.cmdEmail)
MainWindow.setTabOrder(self.cmdEmail, self.cmdHCSBrpt)
MainWindow.setTabOrder(self.cmdHCSBrpt, self.cmdWarRoom)
MainWindow.setTabOrder(self.cmdWarRoom, self.cmdReview)
MainWindow.setTabOrder(self.cmdReview, self.cmdIC_AccessDB)
MainWindow.setTabOrder(self.cmdIC_AccessDB, self.btnCaseCAUTI)
MainWindow.setTabOrder(self.btnCaseCAUTI, self.btnCaseCLABSI)
MainWindow.setTabOrder(self.btnCaseCLABSI, self.btnCaseSSI)
MainWindow.setTabOrder(self.btnCaseSSI, self.btnCaseVAP)
MainWindow.setTabOrder(self.btnCaseVAP, self.btnCaseLabID)
MainWindow.setTabOrder(self.btnCaseLabID, self.btnCaseMDRO)
MainWindow.setTabOrder(self.btnCaseMDRO, self.btnHH)
MainWindow.setTabOrder(self.btnHH, self.btnNHSN)
MainWindow.setTabOrder(self.btnNHSN, self.btnHAI)
MainWindow.setTabOrder(self.btnHAI, self.btnPremier)
MainWindow.setTabOrder(self.btnPremier, self.btnFlu)
MainWindow.setTabOrder(self.btnFlu, self.btnMicrosoft)
MainWindow.setTabOrder(self.btnMicrosoft, self.dateEdit)
MainWindow.setTabOrder(self.dateEdit, self.timeEdit)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "Infection Control Database - Landing Page", None))
self.lblWelcome.setText(_translate("MainWindow", "Welcome!", None))
self.dateEdit.setDisplayFormat(_translate("MainWindow", "MMMM dd yyyy", None))
self.btnExit.setStatusTip(_translate("MainWindow", "Exit Database", None))
self.btnExit.setText(_translate("MainWindow", "Exit", None))
self.btnExit.setShortcut(_translate("MainWindow", "Ctrl+Shift+Q", None))
self.btnHelp.setText(_translate("MainWindow", "Help", None))
self.btnRequest.setText(_translate("MainWindow", "Request ", None))
self.grpReportsSOR.setStatusTip(_translate("MainWindow", "SOR Reports", None))
self.grpReportsSOR.setTitle(_translate("MainWindow", "SOR Files", None))
self.btnSOR_IFMC.setText(_translate("MainWindow", "IFMC", None))
self.btnSOR_IAH.setText(_translate("MainWindow", "IAH", None))
self.btnSOR_ILH.setText(_translate("MainWindow", "ILH", None))
self.btnSOR_IMVH.setText(_translate("MainWindow", "IMVH", None))
self.btnSOR_IFOH.setText(_translate("MainWindow", "IFOH", None))
self.grp_EnterCaseData.setTitle(_translate("MainWindow", "Case Data Entry", None))
self.btnCaseCAUTI.setStatusTip(_translate("MainWindow", "Enter CAUTI Case", None))
self.btnCaseCAUTI.setText(_translate("MainWindow", "CAUTI Case", None))
self.btnCaseCLABSI.setStatusTip(_translate("MainWindow", "Enter CLABSI Case ", None))
self.btnCaseCLABSI.setText(_translate("MainWindow", "CLABSI Case", None))
self.btnCaseSSI.setStatusTip(_translate("MainWindow", "Enter SSI Case", None))
self.btnCaseSSI.setText(_translate("MainWindow", "SSI Case", None))
self.btnCaseVAP.setStatusTip(_translate("MainWindow", "Enter VAP Case", None))
self.btnCaseVAP.setText(_translate("MainWindow", "VAP Case", None))
self.btnCaseLabID.setStatusTip(_translate("MainWindow", "Enter LabID Case", None))
self.btnCaseLabID.setText(_translate("MainWindow", "LabID Case", None))
self.btnCaseMDRO.setStatusTip(_translate("MainWindow", "Enter MDRO Cases", None))
self.btnCaseMDRO.setText(_translate("MainWindow", "MDRO", None))
self.cmdEmail.setText(_translate("MainWindow", "Email", None))
self.cmdHCSBrpt.setText(_translate("MainWindow", "HCSB Report", None))
self.cmdWarRoom.setText(_translate("MainWindow", "War Room Report", None))
self.cmdReview.setText(_translate("MainWindow", "Review HAI Data", None))
self.cmdIC_AccessDB.setText(_translate("MainWindow", "2011 IC Access Database", None))
self.label.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\"><span style=\" font-weight:600; color:#aa0000;\">Infection Control Database</span></p></body></html>", None))
self.btnHH.setStatusTip(_translate("MainWindow", "Hand Hygiene Application", None))
self.btnNHSN.setStatusTip(_translate("MainWindow", "NHSN Website", None))
self.btnHAI.setStatusTip(_translate("MainWindow", "HAI Folder", None))
self.btnPremier.setStatusTip(_translate("MainWindow", "Navigate to SafetySurveillor: https://ss.premierinc.com/Setnet/user/Login.po ", None))
self.btnFlu.setStatusTip(_translate("MainWindow", "Flu Reports", None))
self.groupBox.setStatusTip(_translate("MainWindow", "Navigate to Location", None))
self.groupBox.setTitle(_translate("MainWindow", "Navigation ", None))
self.menuFile.setTitle(_translate("MainWindow", "File", None))
self.menuEnd_Processes.setTitle(_translate("MainWindow", "End Processes", None))
self.menuView.setTitle(_translate("MainWindow", "View", None))
self.menuReports.setTitle(_translate("MainWindow", "Reports", None))
self.actionExit.setText(_translate("MainWindow", "Exit", None))
self.actionExit.setShortcut(_translate("MainWindow", "Ctrl+Shift+Q", None))
self.actionTerminate_Excel.setText(_translate("MainWindow", "Terminate Excel", None))
self.actionTerminate_Access.setText(_translate("MainWindow", "Terminate Access", None))
self.actionTerminate_Powerpoint.setText(_translate("MainWindow", "Terminate PowerP", None))
self.actionTerminate_Word.setText(_translate("MainWindow", "Terminate Word", None))
self.actionReset_Citrix.setText(_translate("MainWindow", "Reset Citrix", None))
self.actionReset_Citrix.setStatusTip(_translate("MainWindow", "Reset Citrix Server", None))
self.actionTerminate_Outlook.setText(_translate("MainWindow", "Terminate Outlook", None))
self.actionHCSB.setText(_translate("MainWindow", "HCSB", None))
self.actionWar_Room.setText(_translate("MainWindow", "War Room", None))
self.actionFlu.setText(_translate("MainWindow", "Flu", None))
self.cmdEmail.clicked.connect(self.EmailClicked)
self.btnExit.clicked.connect(self.ExitClicked)
def EmailClicked(self):os.startfile('C:\\Program Files\Microsoft Office\Office14\OUTLOOK.EXE')
def ExitClicked(self):
ret = QMessageBox.critical(self, "Critical",
'Are you sure you want to exit?', QMessageBox.Ok, QMessageBox.Cancel)
ret = msgBox.exec_()
if ret == msgBox.Yes:
QtCore.QCoreApplication.instance().quit()
class ControlMainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(ControlMainWindow, self).__init__(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.dateEdit.setDisplayFormat("MMM dd yyyy")
self.ui.timeEdit.setDisplayFormat("hh:mm:ss AP")
self.updateTime()
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.updateTime)
self.timer.start(1000)
def updateTime(self):
current = QtCore.QDateTime.currentDateTime()
self.ui.dateEdit.setDate(current.date())
self.ui.timeEdit.setTime(current.time())
def closeEvent(self, event):
result = QtGui.QMessageBox.critical(self,
"Confirm Exit...",
"Are you sure you want to exit?",
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
event.ignore()
if result == QtGui.QMessageBox.Yes:
event.accept()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
#app.setStyle( "Classic" )
mySW = ControlMainWindow()
mySW.show()
sys.exit(app.exec_())
The code you have generates an error because QMessageBox.critical
needs to pass a QObject
object and Ui_MainWindow
is not.
class Ui_MainWindow(object):
....
def ExitClicked(self):
ret = QMessageBox.critical(self, "Critical",
'Are you sure you want to exit?', QMessageBox.Ok, QMessageBox.Cancel)
ret = msgBox.exec_()
if ret == msgBox.Yes:
QtCore.QCoreApplication.instance().quit()
In addition you want that pressing the button to close default and your new close button have the same behavior, you have to connect the signal that emits the new button with the close function,since the close function calls closeEvent
.
class Ui_MainWindow(object):
....
class ControlMainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(ControlMainWindow, self).__init__(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.btnExit.clicked.connect(self.close)
....
def closeEvent(self, event):
result = QtGui.QMessageBox.critical(self,
"Confirm Exit...",
"Are you sure you want to exit?",
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
event.ignore()
if result == QtGui.QMessageBox.Yes:
event.accept()
Delete connection: self.btnExit.clicked.connect(self.ExitClicked)
and function def ExitClicked(self): ...