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

Posted

技术标签:

【中文标题】如何在 Qt 中创建一个基本的自定义 QGraphicsEffect?【英文标题】:How to create a basic custom QGraphicsEffect in Qt? 【发布时间】:2020-01-29 11:52:35 【问题描述】:

我一直在尝试创建一个基本的 QGraphicsEffect 来更改小部件的颜色,但首先我尝试制作一个不做任何事情的效果:

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

我正在使用 PySide2。虽然我查遍了整个互联网,但找不到任何样本,既不是模板也不是真正的自定义效果。

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

【问题讨论】:

【参考方案1】:

由于您的问题基本上是如何根据an example offered by the Qt community 创建自定义效果,因此我已将其翻译为 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_())

【讨论】:

这不会编译,super 需要 1 个参数,0 give,应该是 super(HighlightEffect, self) @JoanVenge 你用的是什么版本的python?我假设如果 OP 没有指出,那么使用最新版本的 Python,即 python3,但您似乎使用的是 python2。 我使用的是 2.7。然后请在您的答案中为未来的读者指定版本。 @JoanVenge MHO 最好让 OP 指定其版本 :-) 以便那些尝试回复的人知道答案必须有哪些限制。 @JoanVenge 无论如何我已经更新它以兼容 python2了

以上是关于如何在 Qt 中创建一个基本的自定义 QGraphicsEffect?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用该节点的自定义类检测在单独场景中创建的 skspritenode 上的触摸

如何在颤动中创建具有圆形边缘的自定义容器?

如何在 onlyoffice 中创建用于 .xlsx 的自定义函数

如何从 Java 中的自定义谓词列表中创建一个谓词?

如何在 C# 中创建自定义属性

Java Swing 如何在我的自定义 ColorChooserPanel 中创建颜色样本?