我有QGraphicsScene
一堆线条相当复杂。我想要一个非常特定的区域具有不同的色调。举例来说,一个蓝色的线穿过该区域将显示为红色内的区域,但仍为蓝色之外。
自然,可以只绘制三条线而不是一条线,但这需要编写额外的代码来确定给定的线是否通过特定区域,如果是,则交叉点的坐标是什么。可行,但不是最容易编码的事情。因此,如果 Qt 能为我做到这一点,那就太好了。
这是可能的吗?
我解决这个问题的方法是:
QGraphicsRectItem
如果区域应该是矩形的,则子类化并重新实现其绘制方法
设定组合物模式的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] 删除。
我来说两句