Оттенки серого QPushButton с QIcon пока не завис над - PullRequest
0 голосов
/ 31 марта 2020

У меня есть QPushButton с набором QIcon. Я бы хотел, чтобы цвета значка были в градациях серого, пока они не были наведены или не выделены, без записи 2 отдельных файлов изображений для каждого значка. Если использовать QPushButton.setDisabled(True), то цвета иконки на самом деле превращаются в оттенки серого, поэтому я бы хотел, чтобы это же поведение контролировалось с помощью enterEvent. Это вообще возможно?

1 Ответ

1 голос
/ 31 марта 2020

Да, вы можете делать именно то, что вы описали. Включите кнопку в enterEvent и отключите ее в leaveEvent, если она не отмечена.

import sys
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *

class Button(QPushButton):

    def __init__(self):
        super().__init__()
        self.setCheckable(True)
        self.setDisabled(True)
        self.setIcon(QIcon('icon.png'))
        self.setIconSize(QSize(100, 100))

    def enterEvent(self, event):
        self.setEnabled(True)

    def leaveEvent(self, event):
        if not self.isChecked():
            self.setDisabled(True)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()
    grid = QGridLayout(w)
    grid.addWidget(Button(), 0, 0, Qt.AlignCenter)
    w.show()
    sys.exit(app.exec_())

Я использовал зеленую галочку для изображения значка. Результат:

enter image description here

Вам также не нужно для подкласса QPushButton, это тоже будет работать.

btn = QPushButton()
btn.setCheckable(True)
btn.setIcon(QIcon('icon.png'))
btn.setIconSize(QSize(100, 100))

btn.setDisabled(True)
btn.enterEvent = lambda _: btn.setEnabled(True)
btn.leaveEvent = lambda _: btn.setEnabled(btn.isChecked())
...