Qt:如何获取 QQuickItem 的快照,将其子 QQuickItems 从获取的结果中剔除

Posted

技术标签:

【中文标题】Qt:如何获取 QQuickItem 的快照,将其子 QQuickItems 从获取的结果中剔除【英文标题】:Qt : How to grab a snapshot of a QQuickItem leaving out its child QQuickItems from the grabbed result 【发布时间】:2018-07-04 22:06:49 【问题描述】:

我的问题是对this discussion 的跟进。

是的。遵循grabToImage 的方式可以让我获得任何特定QQuickItem 的快照,例如下面的parent_rect

Rectangle 
    id: parent_rect
    width: 400
    height: 400

    Rectangle 
        id: child_rect1
        width: parent.width/4
        height: parent.height/4
    

    Rectangle 
        id: child_rect2
        width: parent.width/4
        height: parent.height/4
    

// ...
parent_rect.grabToImage(function(result) 
                       result.saveToFile("something.png");
                   );

问题: 但是这个grabToImage 也让我得到了它所有孩子的快照,即child_rect1child_rect2

问题: 如何只获取parent_rect 的快照而不将其子项添加到返回的结果中?

【问题讨论】:

【参考方案1】:

一种可能的解决方案是隐藏孩子,然后恢复可见性。

例子:

import QtQuick 2.9
import QtQuick.Window 2.2

Window 
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    function grabWithoutChildren(item, filename)
        var isVisibleList = []
        var i
        for(i in item.children)
            isVisibleList[i] = item.children[i].visible
            item.children[i].visible = false
        

        item.grabToImage(function(result) 
            result.saveToFile(filename)
            for(i in item.children)
                 item.children[i].visible = isVisibleList[i]
            
        )
    

    Rectangle 
        id: parent_rect
        width: 400
        height: 400
        color: "red"

        Rectangle 
            id: child_rect1
            width: parent.width/4
            height: parent.height/4
            color: "blue"
        

        Rectangle 
            id: child_rect2
            x: 10
            y: 10
            width: parent.width/4
            height: parent.height/4
            color: "green"

            Rectangle
                x:50
                y:50
                width: 100
                height: 100
                color: "white"
            
        
    

    Component.onCompleted: grabWithoutChildren(parent_rect, "something.png")

【讨论】:

好的。至少这是一种方式。 Qt 真的应该为 QQuickItem 类添加一个 API 来给这个层快照,而不必做太多事情。我对文档的搜索开始于期望这将是一件很正常的事情。谢谢@eyllanesc @Game_Of_Threads 应该,但好像在他们的需要内没有。我的解决方案很简单,所以我认为这就足够了。如果我帮助你,你可以给它一个赞成票或将其标记为正确:) 确定@eyllanesc

以上是关于Qt:如何获取 QQuickItem 的快照,将其子 QQuickItems 从获取的结果中剔除的主要内容,如果未能解决你的问题,请参考以下文章

关闭应用程序时 QQuickItem 析构函数/changeListeners 崩溃(Qt 5.6)

如何在 C++ 端获取 QQuickItem 的 C++ 对象实例 [重复]

QQuickItem 类的 boundingRect 从哪里得到它的值?

如何创建 QQuickItem 的单独副本并将其呈现在不同的窗口上

自定义 QQuickItem 未绘制

从项目中获取窗口