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

标签 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。 如何修复中间三行代码,以便当我按住按钮时图标变为clicking.png,然后在释放按钮后变为on.png?谢谢

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

我尝试过使用不同的模式/状态,但仍然无法让它工作

self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(160, 180, 271, 121))
self.pushButton.setStyleSheet("")
self.pushButton.setText("")
icon = QtGui.QIcon()

icon.addPixmap(QtGui.QPixmap("images/Clicking.png"))
icon.addPixmap(QtGui.QPixmap("images/Off.png"), QtGui.QIcon.Active)
icon.addPixmap(QtGui.QPixmap("images/On.png"), QtGui.QIcon.Normal, QtGui.QIcon.On)


self.pushButton.setIcon(icon)
self.pushButton.setIconSize(QtCore.QSize(300, 300))
self.pushButton.setCheckable(True)
self.pushButton.setAutoRepeatDelay(400)
self.pushButton.setDefault(False)
self.pushButton.setObjectName("pushButton")

最佳答案

您将小部件的状态与有关单击的按钮的状态混淆了。在 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")
# ...

关于python - 如何在PyQt5中单击鼠标时更改图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56551263/

相关文章:

python - 在 QFrame 内移动(拖动)QLabel

python - python中部分函数的参数

android - ./distribute.sh -1 上的 Kivy Buildozer 权限被拒绝

python - 从 C++ 嵌入式解释器捕获 python 窗口输出

python - 使用 pip 安装包时出错

python - 简单 NLTK 示例中的 ImportError

python - 如何选择 QTextBrowser 中的所有事件

python - 为什么我不能在某个时刻评估 SymPy 中实现的函数的组合?

python - 从文本文件复制完整的句子并添加到列表

python - AysncResult 和 python 池中 error_callback 回调之间的区别