如何改变场景一部分的色调?

阿尔塞尼·穆尔岑科

我有QGraphicsScene一堆线条相当复杂我想要一个非常特定的区域具有不同的色调。举例来说,一个蓝色的线穿过该区域将显示为红色的区域,但仍为蓝色之外。

自然,可以只绘制三条线而不是一条线,但这需要编写额外的代码来确定给定的线是否通过特定区域,如果是,则交叉点的坐标是什么。可行,但不是最容易编码的事情。因此,如果 Qt 能为我做到这一点,那就太好了。

这是可能的吗?

斯科恰诺夫

解决方案

我解决这个问题的方法是:

  1. QGraphicsRectItem如果区域应该是矩形的,则子类化并重新实现其绘制方法

  2. 设定组合物模式QPainter为适当的值,例如QPainter::RasterOp_SourceAndNotDestination

     painter->setCompositionMode(QPainter::RasterOp_SourceAndNotDestination);
    

注意:对于不同形状的区域,使用不同的图形项。您可能还想尝试组合模式以获得不同的效果。

例子

这是我为您编写的示例,用于演示如何实施建议的解决方案:

#include <QApplication>
#include <QMainWindow>
#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QPainter>

class HueZone : public QGraphicsRectItem
{
public:
    explicit HueZone(QGraphicsItem *parent = nullptr) :
        QGraphicsRectItem(parent) {}

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) override {
        painter->save();
        painter->setPen(pen());
        painter->setBrush(brush());
        painter->setCompositionMode(QPainter::RasterOp_SourceAndNotDestination);
        painter->drawRect(rect());
        painter->restore();
    }
};

class MainWindow : public QMainWindow
{
public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
        auto *view = new QGraphicsView(this);
        auto *line = new QGraphicsLineItem(10, 20, 400, 300);
        auto *zone = new HueZone();

        line->setPen(QPen(Qt::blue));

        zone->setRect(100, 50, 200, 200);
        zone->setBrush(QBrush(Qt::red));
        zone->setPen(QPen(Qt::transparent));

        view->setScene(new QGraphicsScene(this));
        view->scene()->addItem(line);
        view->scene()->addItem(zone);

        setCentralWidget(view);
        resize(600, 480);
        setWindowTitle("Hue Zone");
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    w.show();

    return a.exec();
}

结果

上面的例子产生以下结果:

通过色相区域的线

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章