Как заменить () элемент в Qml StackView, который не находится на вершине стека? - PullRequest
0 голосов
/ 18 февраля 2020

В соответствии с документами Qt я должен быть в состоянии позвонить:

Заменить предмет (цель, предмет, свойства, операция)

Заменяет один или несколько элементов в стеке указанным элементом и операцией и при необходимости применяет набор свойств для элемента. Элементом может быть Элемент, Компонент или URL. Возвращает элемент, который стал текущим.

Поэтому, если бы я принял:

stackView.replace(stackView.get(stackView.depth - 3), mycomponent)

Я бы ожидал, что элемент, расположенный в индексе stackView 2, меньше, чем самый большой индекс, заменить на mycomponent. Однако, это не так; кажется, что индексы depth - 1 и depth - 2 и depth - 3 выталкиваются из стека, затем добавляется экземпляр mycomponent. Как заменить индекс depth - 3 без потери объектов с большим количеством элементов?

MVP: В следующем коде, если I push, push, push, тогда replace, я ожидаю, что Depth at onCompleted: 4 будет значением Current Index: 1. Вместо этого я получаю Depth at onCompleted: 2

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Window {
    visible: true
    width: 640
    height: 480
    id: window

    Component {
        id: mycomponent
        Row {
            spacing: 2
            Button {
                text: "Push"
                onClicked: push(mycomponent)
            }
            Button {
                text: "Pop"
                onClicked: pop()
            }
            Button {
                text: "Replace"
                onClicked: stackView.replace(stackView.get(stackView.depth - 3), mycomponent)
            }
            Text {
                text: "Current Index: " + (stackView.depth - 1)
            }
            Text {
                Component.onCompleted: text = "Depth at onCompleted: " + stackView.depth
            }
        }
    }

    StackView {
        id: stackView
        initialItem: mycomponent
    }
}

1 Ответ

1 голос
/ 18 февраля 2020

Не то, что описанное поведение правильно задокументировано (второй абзац) :

Если указан целевой аргумент, все элементы вплоть до элемента будут заменены. Если цель равна нулю, все элементы в стеке будут заменены. Если не указано иное, будет заменен только верхний элемент.

Решение может заключаться в том, чтобы сначала выбросить 3 элемента (и сохранить два верхних элемента), pu sh ваш новый компонент и в конце пу sh хранившихся предметов:

...
Button {
    text: "Replace"
    onClicked: {
        var item1 = stackView.pop();
        var item2 = stackView.pop();
        stackView.pop();
        stackView.push(mycomponent);
        stackView.push(item2);
        stackView.push(item1);            
    }
}
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...