带有 QIcon 的灰度 QPushButton 直到悬停

Grayscale QPushButton with QIcon until hovered over

我有一个 QPushButton 有一个 QIcon 集合。我想对图标的颜色进行灰度化,直到它悬停或被选中,而不是为每个图标编写 2 个单独的图像文件。如果使用 QPushButton.setDisabled(True),图标的颜色实际上会变成灰度,所以我希望通过 enterEvent 控制同样的行为。这完全可能吗?

是的,您完全可以按照您的描述进行操作。如果未选中,请启用 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_())

我为图标图像使用了绿色复选标记。结果:

您也不需要子类化 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())