如何更改QGraphicsRectItem的颜色

问题描述 投票:2回答:1

我找不到我做错了。我想在发生特定事件时更改项目(QGraphicsRectItem)的颜色。事实是,一旦调用了覆盖绘制方法,无论如何颜色都不会改变。这是我所做的简单代码:

item.h

class Item : public QGraphicsRectItem
{
public:
    Item(QGraphicsView *graphView);
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) override;

private:
    QPointF newPos;
    QGraphicsView *graph;
};

item.cpp

Item::Item(QGraphicsView *graphWidget) : graph(graphWidget) { }

void Item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *)
{
     painter->setPen(Qt::NoPen);
     painter->setBrush(Qt::black);
     painter->drawEllipse(-7, -7, 20, 20);
}

main.cpp

int main(int argc, char *argv[])
{
     srand(QDateTime::currentDateTime().toMSecsSinceEpoch());
     QApplication a(argc, argv);
     QGraphicsScene scene;
     QGraphicsView view(&scene);

     Item *item = new Item(&view);
     scene.addItem(item);
     item->setPos(0, 0);

     item->setBrush(Qt::red);
     item->update();

     view.show();
     return a.exec();
}
c++ qt qgraphicsview qgraphicsscene qgraphicsitem
1个回答
1
投票

如果我正确理解了您的问题,那么问题是,在item->setBrush(Qt::red)之后,您的圈子没有被画家涂成红色。在这种情况下,问题在于您在Qt::NoPen功能中强制使用特定的笔(Qt::red)和画笔(paint),而没有使用Item::pen()Item::brush()来检索信息。相反,您可以执行以下操作:

Item::Item(QGraphicsView *graphWidget) : graph(graphWidget)
{
  setPen(Qt::NoPen);
  setBrush(Qt::black);
}

void Item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *)
{
  Q_UNUSED(option);
  painter->setPen(pen());
  painter->setBrush(brush());
  painter->drawEllipse(-7, -7, 20, 20);
}

这样,您可以在构造函数中定义默认的画笔,但是仍然可以使用Item::setPenItem::setBrush进行更改。此外,对于此示例,您最好继承QAbstractGraphicsShapeItem,但随后必须实现QAbstractGraphicsShapeItem功能。下面的示例输出一个红色的圆圈(我怀疑这是您想要的),并且还用黑色绘制了轮廓(尽管这不是您想要的,但是为了显示笔也会改变):

Item::boundingRect
© www.soinside.com 2019 - 2024. All rights reserved.