I created my own class of a Two State button that inherits QPushButton so that it can compress when clicked on. Anyways, I used a horizontal layout in my main window to take care of resizing my buttons, but I'm running into a problem when I try to resize the window while I have an icon on my TwoStateButton. The button itself gets resized correctly, but the icon on top of it does not. I've experimented with QResizeEvent but am not really sure how to use it. I copied my eventFilter method from the online documentation, but it was originally written in C++ so there's currently some syntax errors. How can I fix my code so that the icon on my button gets resized along with the button itself?
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtCore import QEvent
from PyQt5.Qt import QResizeEvent
class TwoStateButton(QtWidgets.QPushButton):
def __init__(self, on, hover, parent=None):
super(TwoStateButton, self).__init__(parent)
self.setIcon(QtGui.QIcon(on))
self.on = on
self.hover = hover
def mousePressEvent(self, event):
super(TwoStateButton, self).mousePressEvent(event)
self.setIcon(QtGui.QIcon(self.hover))
def mouseReleaseEvent(self, event):
super(TwoStateButton, self).mouseReleaseEvent(event)
self.setIcon(QtGui.QIcon("%s" % (self.on)))
def eventFilter(self, obj, event):
if (event.type() == QEvent.Resize):
print("\nRESIZING\n")
self.setIconSize(QResizeEvent.size(self))
class Ui_MainWindow(QMainWindow):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1090, 681)
MainWindow.setStyleSheet("")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
self.horizontalLayout.setObjectName("horizontalLayout")
self.pushButton_2 = TwoStateButton("images/Button5-3.png", "images/Button5-4.png", self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(430, 310, 141, 81))
self.pushButton_2.setText("")
self.pushButton_2.setIconSize(QtCore.QSize(200, 200))
self.pushButton_2.setCheckable(False)
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_2.installEventFilter(self.pushButton_2)
self.horizontalLayout.addWidget(self.pushButton_2)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1090, 22))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setStyleSheet("border-image: url(:/images/Button5-3.png)")
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Besides not resizing the icon, I'm getting the following error message:
TypeError: invalid result from TwoStateButton.eventFilter(), a 'bool' is expected not 'NoneType'