如何在Qt中创建基本的自定义QGraphicsEffect?

问题描述 投票:0回答:1

我一直在尝试创建一个基本的QGraphicsEffect来更改小部件的颜色,但是首先,我试图制作一个效果不一样的效果:

class QGraphicsSepiaEffect(QtWidgets.QGraphicsEffect):
  def draw(painter):
    pixmap = sourcePixmap()
    painter.drawPixmap(pixmap.rect(), pixmap)

我正在使用PySide2。尽管我检查了整个互联网,但找不到任何样本,但没有模板,也没有真正的自定义效果。

如何编写基本的效果来更改小部件的颜色?

python pyside2 qgraphicseffect
1个回答
1
投票
由于您的问题基本上是如何基于an example offered by the Qt communit y创建自定义效果,所以我已将其翻译为PySide2:

import random import sys from PySide2 import QtCore, QtGui, QtWidgets # or # from PyQt5 import QtCore, QtGui, QtWidgets class HighlightEffect(QtWidgets.QGraphicsEffect): def __init__(self, offset=1.5, parent=None): super(HighlightEffect, self).__init__(parent) self._color = QtGui.QColor(255, 255, 0, 128) self._offset = offset * QtCore.QPointF(1, 1) @property def offset(self): return self._offset @property def color(self): return self._color @color.setter def color(self, color): self._color = color def boundingRectFor(self, sourceRect): return sourceRect.adjusted( -self.offset.x(), -self.offset.y(), self.offset.x(), self.offset.y() ) def draw(self, painter): offset = QtCore.QPoint() try: pixmap = self.sourcePixmap(QtCore.Qt.LogicalCoordinates, offset) except TypeError: pixmap, offset = self.sourcePixmap(QtCore.Qt.LogicalCoordinates) bound = self.boundingRectFor(QtCore.QRectF(pixmap.rect())) painter.save() painter.setPen(QtCore.Qt.NoPen) painter.setBrush(self.color) p = QtCore.QPointF(offset.x() - self.offset.x(), offset.y() - self.offset.y()) bound.moveTopLeft(p) painter.drawRoundedRect(bound, 5, 5, QtCore.Qt.RelativeSize) painter.drawPixmap(offset, pixmap) painter.restore() if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) w = QtWidgets.QWidget() lay = QtWidgets.QVBoxLayout(w) for _ in range(3): o = QtWidgets.QLabel() o.setStyleSheet( """background-color : {}""".format( QtGui.QColor(*random.sample(range(255), 3)).name() ) ) effect = HighlightEffect(parent=o) o.setGraphicsEffect(effect) lay.addWidget(o) w.show() w.resize(640, 480) sys.exit(app.exec_())

enter image description here
© www.soinside.com 2019 - 2024. All rights reserved.