【问题标题】:How to change the color of a QGraphicsRectItem如何更改 QGraphicsRectItem 的颜色
【发布时间】:2020-09-16 17:45:03
【问题描述】:

我找不到哪里做错了。我想在发生特定事件时更改我的项目(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();
}

【问题讨论】:

  • 我不明白您对代码的期望。您在paintEvent中强制您的画笔为黑色,并且您没有在paint事件中绘制矩形项目。

标签: c++ qt qgraphicsview qgraphicsscene qgraphicsitem


【解决方案1】:

如果我正确理解你的问题,问题是在item->setBrush(Qt::red) 之后,你的圈子不是画家红色。如果是这种情况,问题是您在 paint 函数中强制使用特定的笔 (Qt::NoPen) 和画笔 (Qt::red),而您没有使用 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,但你必须实现Item::boundingRectfunction。下面的示例输出一个红色圆圈(我怀疑你想要这样做)并用黑色绘制轮廓(虽然这不是你想要的,但表明笔也发生了变化):

#include <QApplication>
#include <QDateTime>
#include <QGraphicsRectItem>
#include <QGraphicsScene>
#include <QGraphicsView>

class Item : public QAbstractGraphicsShapeItem
{
public:
  Item(QGraphicsView *graphView);

  void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) override;

  virtual QRectF boundingRect() const override;

private:
  QPointF newPos;
  QGraphicsView *graph;
};

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);
}

QRectF Item::boundingRect() const
{
  double pw = pen().widthF() / 2;
  return QRectF(QPointF(-7 - pw, -7 - pw), QSizeF(20 + 2 * pw, 20 + 2 * pw));
}

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->setPen(QPen(Qt::black));
  item->update();

  view.show();
  return a.exec();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2011-01-02
    • 2012-10-16
    • 2012-06-01
    • 2021-10-23
    • 2018-10-01
    相关资源
    最近更新 更多