Что такое самый простой способ применить оттенок цвета к QIcon
в Qt4/PyQt4? У меня есть несколько монохромных QPixmaps
, которые я бы хотел перекрасить на основе свойств связанных объектов.Qt4: тонирование QIcon
ответ
Вы можете закрашивать ваш растровое изображение. Просто выберите 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_())
Если значок может отображаться в собственном виджетах (например, 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_())
Спасибо, кажется, только то, что я ищу. К сожалению, он не работает на моем mac (он работает в Linux). Это, похоже, известная, но проигнорированная ошибка - https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCAQFjAA&url=https%3A%2F%2Fbugreports.qt -project.org% 2Fbrowse% 2FQTBUG-7550% 3Fpage% 3Dcom.atlassian.jira.plugin.system.issuetabpanels% 3Aall-tabpanel & ei = ln51UPXjIImo0AHNqYGoCg & usg = AFQjCNHy0gKn_bpDHO43wbXtK-sFQ8QMEQ – ChrisB
Это прекрасно. благодаря – ChrisB