Как я могу изменить цвет объекта QGraphicsItem? - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь преобразовать его с помощью QGraphicsRectItem, а затем использую метод setBru sh (Qt :: QColor), но это не сработало.

            int r = rand() %itemList.length();
            MyItem *item = itemList.at(r);
            QGraphicsRectItem *rect = qgraphicsitem_cast<QGraphicsRectItem *>(item);
            rect->setBrush(Qt::black);
            rect->update();

Я даже пытался изменить MyItem в QGraphicsRectItem (для того, что я делаю, разницы нет), но все равно не получилось.

1 Ответ

0 голосов
/ 26 мая 2020

Я не могу это воспроизвести. Работает нормально. Возможно, вы меняете какой-то прямоугольник, который не отображается на экране. Вероятно, у вас есть несколько перекрывающихся прямоугольников в одной и той же позиции из-за ошибок в другом месте, и вы не видите изменений, даже если они происходят. Вызов update() не нужен: это будет означать, что реализация элемента нарушена. Каждый раз, когда изменяется видимое свойство элемента, он должен автоматически обновляться. И действительно, это так. Если вы закодировали свои собственные типы элементов, и они требуют ручных вызовов update(), вам необходимо исправить их!

Вот небольшая демонстрация, которая показывает, что setBrush действительно работает на QGraphicsRectItem:

// https://github.com/KubaO/stackoverflown/tree/master/questions/qgraphicsitem-brush-62028912
#include <QtWidgets>
#include <cstdlib>

QColor randColor() { return QRgb((rand() << 16) ^ rand()); }

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

   auto *rect = scene.addRect(0, 0, 100, 100);
   view.fitInView(rect);

   QTimer timer;
   QObject::connect(&timer, &QTimer::timeout, &view, [rect]{
      rect->setBrush(randColor());
   });
   timer.start(500);

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

Эта демонстрация подойдет вам. Затем вам нужно выяснить, какие еще ошибки у вас есть, потому что setBrush не является виновником.

...