Как изменить значок, когда мышь щелкает в PyQt5 - PullRequest
1 голос
/ 11 июня 2019

Я использую Python 3.6 на PyQt5. Я хочу, чтобы кнопка была off.png по умолчанию, затем, когда я нажимаю на нее, значок становится click.png, а когда я отпускаю щелчок, он становится On.png. В настоящее время по умолчанию это off.png, но нажатие на него не меняет значок на click.png, а при отпускании успешно меняет значок на on.png

Как ни странно, когда я щелкаю по окну (а не по фактической кнопке), значок переключается на click.png и возвращается к off.png после его отпускания. Как я могу исправить средние три строки кода, чтобы значок стал click.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")

1 Ответ

1 голос
/ 11 июня 2019

Вы путаете состояния виджета с состояниями кнопки относительно нажатых. В случае, когда 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")
# ...
...