我确实有 2 个 QDeclarativeItems。
void BackgroundLayer::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
painter->drawImage( QRectF(dx1, dy1, dx2-dx1, dy2-dy1), shownImage, QRectF(sx1, sy1, sx2-sx1, sy2-sy1) );
}
void ForegroundLayer::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
QPen pen(Qt::red, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
painter->setPen(pen);
painter->drawLine(p1, p2);
}
QML
Rectangle {
width: 1920
height: 1080
BackgroundLayer{
id: background_layer
anchors.fill: parent
}
ForegroundLayer {
id: foreground_layer
anchors.fill: parent
}
}
在ForegroundLayer上绘图会触发BackgroundLayer绘制事件,导致它重新绘制整个图像。因此,绘图速度很慢。是否可以避免这种情况并仅在真正需要时重新绘制图像?
最佳答案
为什么您期望任何其他类型的行为? Qt 不会为您保留每个声明项的图像,这在内存方面会非常昂贵。不过,您可以选择启用此功能:也许您应该这样做。请参阅cacheMode文档。
当任何项目需要更新时,下面的所有内容以及与更新矩形相交的所有内容都必须按照 Z 顺序从下到上重新绘制。如果 QGraphicsView
下面有任何小部件如果 View 本身是半透明的,那么这些小部件也必须重新绘制。
如果您确切地知道哪些区域需要更新,您应该使用该知识:调用 QGraphicsItem::update(const QRectF &)
指示需要更新的范围。否则,使用空矩形时,更新区域会跨越整个项目。
同时确保QGraphicsView
的updateMode
设置为MinimalViewportUpdate
.
在幕后,所有 QGraphicsItem
实例和所有 QWidget
实例均在内部绘制 QImage
然后将其传输或交换到底层 native 窗口中。它们按照从后到前的 Z 顺序进行绘制,唯一被跳过的小部件或项目是那些完全包含在不透明小部件或项目下的小部件或项目。
关于c++ - Qt 在背景项上传播绘制事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39769595/