I am fairly new to PyQt and I found a piece of code that I used to help close a progressbar window when main program closes.
I understand most of what is going on, but I do not get why the installEventFilter/removeEventFilter methods are even called, because I looked them up using python and the functions show that they don't do anything because of pass
def installEventFilter(self, QObject): # real signature unknown; restored from __doc__
""" installEventFilter(self, QObject) """
pass
def removeEventFilter(self, QObject): # real signature unknown; restored from __doc__
""" removeEventFilter(self, QObject) """
pass
I tested it out by removing those lines of code, and it works just as expected. My question is how exactly does event filters work in this case?
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
from PyQt5.QtWidgets import QApplication,QProgressBar,QMainWindow,QDialog,QLabel
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(477, 240)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
MainWindow.setMinimumSize(QtCore.QSize(477, 240))
MainWindow.setMaximumSize(QtCore.QSize(477, 240))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(160, 100, 141, 23))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth())
self.pushButton.setSizePolicy(sizePolicy)
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 477, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Show Progress Bar"))
class MCVE(QMainWindow,Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.pushButton.clicked.connect(self.showProgressBar)
def showProgressBar(self):
self.prog_win = QDialog(self)
self.prog_win.resize(400, 100)
self.prog_win.setFixedSize(self.prog_win.size())
self.prog_win.setWindowTitle("Loading")
EventWatcher(self.prog_win)
self.lbl = QLabel(self.prog_win)
self.lbl.setText("Please Wait...")
self.lbl.move(15, 18)
self.progressBar = QProgressBar(self.prog_win)
self.progressBar.resize(410, 25)
self.progressBar.move(15, 40)
self.progressBar.setRange(0, 1)
self.prog_win.show()
self.progressBar.setRange(0, 0)
class EventWatcher(QtCore.QObject):
def __init__(self, parent):
super().__init__(parent)
parent.installEventFilter(self)
def eventFilter(self, source, event):
if source is self.parent():
if event.type() == QtCore.QEvent.Show:
target = source.parent()
while target.parent() is not None:
target = target.parent()
source.removeEventFilter(self)
target.installEventFilter(self)
elif event.type() == QtCore.QEvent.Close:
source.closeEvent(event)
if event.isAccepted():
self.parent().close()
return True
return QtCore.QObject.eventFilter(self, source, event)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MCVE()
window.show()
sys.exit(app.exec_())