我找不到我做错了。我想在发生特定事件时更改项目(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();
}
如果我正确理解了您的问题,那么问题是,在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::setPen
和Item::setBrush
进行更改。此外,对于此示例,您最好继承QAbstractGraphicsShapeItem
,但随后必须实现QAbstractGraphicsShapeItem
功能。下面的示例输出一个红色的圆圈(我怀疑这是您想要的),并且还用黑色绘制了轮廓(尽管这不是您想要的,但是为了显示笔也会改变):
Item::boundingRect