Qt: Как получить снимок QQuickItem, исключая его дочерние QQuickItems из захваченного результата

Мой вопрос связан с это обсуждение.

Да. Следующий способ 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_rect1 и child_rect2.

Вопрос:
Как я могу получить моментальный снимок только parent_rect без добавления его дочерних элементов в возвращаемый результат?


person TheWaterProgrammer    schedule 04.07.2018    source источник


Ответы (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")
}
person eyllanesc    schedule 04.07.2018
comment
в порядке. по крайней мере, это один из способов. Qt действительно должен добавить API к классу QQuickItem, чтобы получить этот моментальный снимок слоя, не делая многого. Мой поиск в документах начался с ожидания, что это будет вполне нормально. Спасибо @eyllanesc - person TheWaterProgrammer; 05.07.2018
comment
@Game_Of_Threads Должны, но похоже, что в их потребности это не входит. Мое решение простое, поэтому я думаю, что этого достаточно. если я помогу вам, вы можете проголосовать за него или отметить его как правильный :) - person eyllanesc; 05.07.2018
comment
конечно @eyllanesc - person TheWaterProgrammer; 05.07.2018