Qt4:着色QIcon

时间:2012-10-09 20:25:02

标签: python qt4 pyqt4 tint qicon

在Qt4 / PyQt4中将颜色色调应用于QIcon的最简单方法是什么?我有几个单色QPixmaps,我想根据相关对象的属性重新着色。

2 个答案:

答案 0 :(得分:6)

你可以在你的像素图上画画。只需选择适合您目标的composition mode即可。

下面是一个简单的Tinter工具。 applyTint方法是有趣的部分。这使用Overlay组合。

import sys
from PyQt4 import QtGui, QtCore

class Tinter(QtGui.QWidget):
    def __init__(self, image, parent=None):
        super(Tinter, self).__init__(parent)

        self.pixmap = QtGui.QPixmap(image)

        self.normal = QtGui.QLabel()
        self.normal.setPixmap(self.pixmap)
        self.tinted = QtGui.QLabel()

        self.red = QtGui.QSlider(QtCore.Qt.Horizontal)
        self.red.setRange(0, 255)
        self.red.sliderMoved.connect(self.applyTint)
        self.green = QtGui.QSlider(QtCore.Qt.Horizontal)
        self.green.setRange(0, 255)
        self.green.sliderMoved.connect(self.applyTint)
        self.blue = QtGui.QSlider(QtCore.Qt.Horizontal)
        self.blue.setRange(0, 255)
        self.blue.sliderMoved.connect(self.applyTint)
        self.alpha = QtGui.QSlider(QtCore.Qt.Horizontal)
        self.alpha.setRange(0, 255)
        self.alpha.setValue(128)
        self.alpha.sliderMoved.connect(self.applyTint)


        controlLayout = QtGui.QFormLayout()
        controlLayout.addRow('red', self.red)
        controlLayout.addRow('green', self.green)
        controlLayout.addRow('blue', self.blue)
        controlLayout.addRow('alpha', self.alpha)

        layout = QtGui.QHBoxLayout()
        layout.addWidget(self.normal)
        layout.addWidget(self.tinted)
        layout.addLayout(controlLayout)
        self.setLayout(layout)

        self.applyTint()

    def applyTint(self):
        temp = QtGui.QPixmap(self.pixmap)
        color = QtGui.QColor(self.red.value(),
                             self.green.value(),
                             self.blue.value(),
                             self.alpha.value())
        painter = QtGui.QPainter(temp)
        painter.setCompositionMode(painter.CompositionMode_Overlay)
        painter.fillRect(temp.rect(), color)
        painter.end()
        self.tinted.setPixmap(temp)

app = QtGui.QApplication(sys.argv)

main = Tinter('so.jpg')
main.show()

sys.exit(app.exec_())

enter image description here

答案 1 :(得分:1)

如果图标可以显示在自己的小部件中(例如QLabel),那么一个简单的解决方案就是应用QGraphicsColorizeEffect

这是一个简单的演示:

from random import randint
from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.label = QtGui.QLabel(self)
        self.label.setPixmap(QtGui.QPixmap('image.jpg'))
        self.button = QtGui.QPushButton('Tint', self)
        self.button.clicked.connect(self.handleButton)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.label)
        layout.addWidget(self.button)

    def handleButton(self):
        if self.label.graphicsEffect() is None:
            self.effect = QtGui.QGraphicsColorizeEffect(self)
            self.effect.setStrength(0.6)
            self.label.setGraphicsEffect(self.effect)
        self.effect.setColor(QtGui.QColor(
            randint(0, 255), randint(0, 255), randint(0, 255)))

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())