У меня есть QWidget
, который держит QGraphicsScene
с несколькими предметами. Некоторые из этих элементов относятся к QGraphicsRectItem
и относятся к QGraphicsItem
подклассам. Когда в сцене только QGraphicsRectItem
, производительность приложения нормальная, а использование процессора нормальное, от 0% до 10%. Но когда я добавляю в сцену QGraphicsItem
s, всегда вызывается событие рисования, что увеличивает использование процессора до 50% - 70%, а иногда приложение зависает.
Когда я устанавливаю QGraphicsView viewUpdateMode на QGraphicsView :: NoViewportUpdate, тогда использование процессора нормальное, как с QGraphicsItems, так и с QGraphicsRectItems, но когда viewUpdateMode установлен на QGraphicsView :: FullViewportUpdphics, QGraphicsView :: FullViewportUpdphics, QGraphicsView :: MinimatealView, тогда PaintGraphicsView: в QGraphicsItem вызывается в цикле, даже если в сцене нет изменений.
Таким образом я создаю QGraphicsScene, а QGrpahicsView выглядит так.
scene = new QGraphicsScene();
scene->setItemIndexMethod(QGraphicsScene::NoIndex);
scene->setSceneRect(0, 0, 470, 720);
view = new QGraphicsView(scene);
view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing);
view->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
view->setMouseTracking(true);
А подкласс QGraphicsItem выглядит так:
MyItem::MyItem(QGraphicsItem *parent)
: QGraphicsItem(parent),
mIsHover(false), mIsSelected(false)
{
pixmapItem1 = new QGraphicsPixmapItem(this);
pixmapItem2 = new QGraphicsPixmapItem(this);
textItem = new QGraphicsTextItem(this);
pixmapItem1->setParentItem(this);
pixmapItem2->setParentItem(this);
textItem->setParentItem(this);
textItem->setTextWidth(60);
this->setAcceptTouchEvents(true);
this->setAcceptDrops(true);
this->setAcceptHoverEvents(true);
this->setAcceptedMouseButtons(Qt::LeftButton);
this->setFlag(QGraphicsItem::ItemIsSelectable);
this->setFlag(QGraphicsItem::ItemIsMovable);
this->setFlag(QGraphicsItem::ItemSendsGeometryChanges);
this->setFlag(QGraphicsItem::ItemSendsScenePositionChanges);
}
QRectF MyItem::boundingRect() const
{
QRectF rect = this->childrenBoundingRect();
return rect;
}
void MyItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* opt,QWidget* wdgt)
{
qDebug() << "-> MyItem::pain()";
painter->setClipRect(this->boundingRect());
if(this->mIsHover || this->mIsSelected){
painter->setBrush(QColor(Qt::green));
painter->setPen(Qt::black);
painter->drawRect(this->boundingRect());
}else{
painter->setBrush(Qt::transparent);
painter->setPen(Qt::NoPen);
painter->drawRect(this->boundingRect());
}
}
void MyItem::hoverEnterEvent(QGraphicsSceneHoverEvent*)
{
qDebug() << Q_FUNC_INFO;
this->mIsHover = true;
this->update();
}
void MyItem::hoverLeaveEvent(QGraphicsSceneHoverEvent*)
{
qDebug() << Q_FUNC_INFO;
this->mIsHover = false;
this->update();
}
Итак, вопрос в том, как я могу сделать так, чтобы событие рисования вызывалось только тогда, когда есть какие-либо изменения в сцене или в каком-либо объекте на сцене, и при этом QGraphicsScene не вызывает все время событие рисования QGraphicsItem?