在PyQt5中单击鼠标时如何更改图标

时间:2019-06-11 20:27:58

标签: python python-3.x pyqt pyqt5 qt-designer

我在PyQt5上使用python 3.6。 我希望默认情况下该按钮为off.png,然后在单击该按钮时,该图标变为clicking.png,而在松开该按钮时,其图标变为On.png 当前,默认情况下它是off.png,但是单击它不会将图标更改为clicking.png,释放后会成功将图标更改为on.png

但是,奇怪的是,当我单击窗口(而不是实际的按钮)时,该图标会切换为clicking.png并在我释放它后又回到off.png。 如何固定中间的三行代码,以便在按住按钮时图标变为click.png,一旦松开它便变为on.png?谢谢

注意:如果您没有在计算机上保存任何图像,我认为代码不会按原样运行。

我尝试弄乱不同的模式/状态,但仍然无法正常工作

ng test fails

1 个答案:

答案 0 :(得分:1)

您将小部件的状态与按钮相对于被单击状态的混淆。在QIcon使用小部件的状态的情况下,例如,正常状态是用户不与小部件交互时的状态,选定状态是用户选择小部件时的状态,禁用状态是小部件被禁用的状态,并且活动状态是用户与窗口小部件交互时的状态。另一方面,根据您的逻辑,无法知道按下之前和释放之后的状态。

解决方案是实现自定义按钮:

# ...

class PushButton(QtWidgets.QPushButton):
    def __init__(self, parent=None):
        super(PushButton, self).__init__(parent)
        self.setIcon(QtGui.QIcon("images/Off.png"))

    def mousePressEvent(self, event):
        super(PushButton, self).mousePressEvent(event)
        self.setIcon(QtGui.QIcon("images/Clicking.png"))

    def mouseReleaseEvent(self, event):
        super(PushButton, self).mouseReleaseEvent(event)
        self.setIcon(
            QtGui.QIcon("images/On.png" if self.isChecked() else "images/Off.png")
        )

# ...
self.pushButton = PushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(160, 180, 271, 121))
self.pushButton.setStyleSheet("")
self.pushButton.setText("")
self.pushButton.setIconSize(QtCore.QSize(300, 300))
self.pushButton.setCheckable(True)
self.pushButton.setAutoRepeatDelay(400)
self.pushButton.setDefault(False)
self.pushButton.setObjectName("pushButton")
# ...