Как изменить цвет QGraphicsRectItem - PullRequest
1 голос
/ 29 мая 2020

Не могу найти, где я делаю не так. Я хочу изменить цвет своего элемента (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();
}

1 Ответ

2 голосов
/ 29 мая 2020

Если я правильно понимаю ваш вопрос, проблема в том, что после item->setBrush(Qt::red) ваш круг не окрашен в красный цвет. Если это так, проблема заключается в том, что вы заставляете указывать c pen (Qt::NoPen) и bru sh (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);
}

Таким образом, вы определите перо и bru sh по умолчанию в конструкторе, но вы все равно можете изменить их, используя Item::setPen и Item::setBrush. Более того, для этого примера лучше унаследовать QAbstractGraphicsShapeItem, но тогда вам нужно реализовать функцию Item::boundingRect. В следующем примере выводится красный кружок (это то, что я подозреваю вы хотите сделать), а также рисовать контур черным цветом (хотя это не то, что вы хотели, но чтобы показать, что перо также меняется):

#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();
}
...