c++ - Qt 在背景项上传播绘制事件

标签 c++ qt qml

我确实有 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 &)指示需要更新的范围。否则,使用空矩形时,更新区域会跨越整个项目。

同时确保QGraphicsViewupdateMode设置为MinimalViewportUpdate .

在幕后,所有 QGraphicsItem实例和所有 QWidget实例均在内部绘制 QImage然后将其传输或交换到底层 native 窗口中。它们按照从后到前的 Z 顺序进行绘制,唯一被跳过的小部件或项目是那些完全包含在不透明小部件或项目下的小部件或项目。

关于c++ - Qt 在背景项上传播绘制事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39769595/

相关文章:

c++ - Web Assembly (wasm) 会有自己的语法吗?

python - 在PyQt中使用QAudioOutput播放声音

c++ - 如何在没有对象的情况下执行槽函数?

javascript - Qt Qml Javascript - 在哪里使用哪个?

qt - QML 中与 DPI 无关的常量大小

c++ - 将 QList<Type*> 绑定(bind)到 QListView

c++ - 使 Clang-Format 忽略换行符的注释

c++ - 初始化对 istream 的引用

c++ - 我可以声明一个位表吗?

python - 将按钮信号绑定(bind)到 Qt 中的插槽所需的另一种解决方案