我想要一个QGraphicsLineItem,其中它用某种颜色勾勒出轮廓。
我尝试使用
QGraphicsLineItem::setColor(QColor(...))
但是,这仅绘制内部。
创建轮廓时必须调用什么函数?
更具体地说,假设这是正常的QGraphicsLineItem
--------------------------------------
10px
green QGraphicsLineItem
--------------------------------------
我想要的是边界之外的完全不同的(纯色),
--------------------------------------
2px blue
--------------------------------------
10px
green
--------------------------------------
2px blue
--------------------------------------
所以阴影效果将不起作用,希望这是清楚的。
答案 0 :(得分:0)
向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);
}
此示例产生以下结果:
答案 1 :(得分:0)
添加轮廓的另一种方法是使用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上找到。
此示例产生以下结果: