如何在QGraphicsLineItem中添加轮廓?

时间:2018-09-13 19:14:12

标签: qt c++11

我想要一个QGraphicsLineItem,其中它用某种颜色勾勒出轮廓。

我尝试使用

QGraphicsLineItem::setColor(QColor(...))

但是,这仅绘制内部。

创建轮廓时必须调用什么函数?

更具体地说,假设这是正常的QGraphicsLineItem

--------------------------------------
    10px
    green QGraphicsLineItem
--------------------------------------

我想要的是边界之外的完全不同的(纯色),

--------------------------------------
2px blue 
--------------------------------------
10px
green
--------------------------------------
2px blue
--------------------------------------

所以阴影效果将不起作用,希望这是清楚的。

2 个答案:

答案 0 :(得分:0)

解决方案1 ​​

QGraphicsLineItem添加轮廓的一种方法是使用偏移量为零的QGraphicsDropShadowEffect

注意:这种方法不需要子类化,但是它不够健壮,因为它不允许精确地设置刻度线,轮廓也不牢固。但是,在某些情况下,这可能会很好。

以下是如何执行此操作的示例:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    auto *view = new QGraphicsView(this);
    auto *item = new QGraphicsLineItem(50, 50, 250, 150);
    auto *effect = new QGraphicsDropShadowEffect(this);

    effect->setColor(Qt::blue);
    effect->setOffset(0);
    effect->setBlurRadius(10);

    item->setPen(QPen(Qt::green, 10));
    item->setGraphicsEffect(effect);

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

    setCentralWidget(view);
    resize(300, 200);
}

此示例产生以下结果:

Window with a thick green line with a glowing blue outline

答案 1 :(得分:0)

解决方案2

添加轮廓的另一种方法是使用QPainter::strokePath。为此,您必须继承 QGraphicsLineItem 并重新实现paint方法。

注意:这种方法较为复杂,因为它需要子类化,但是它具有更大的自由度,包括设置刻度和轮廓线的颜色。

以下是如何执行此操作的示例:

void OutLineItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QPainterPath outline;

    outline.moveTo(line().p1());
    outline.lineTo(line().p2());

    painter->save();
    painter->setRenderHint(QPainter::Antialiasing);
    painter->strokePath(outline, QPen(m_outlineColor, 2*m_outlineWidth + pen().width()));
    painter->setPen(pen());
    painter->drawLine(line());
    painter->restore();
}

我为您准备的示例的完整代码可在GitHub上找到。

此示例产生以下结果:

Window with a thick green line with a solid blue outline