LINUX.ORG.RU

Как отловить момент «выталкивания» (pop) страницы в StackView в QML?

 , , , ,


0

2

Все приложение у меня построено на StackView. В приложении есть страница выбора файла, которое используется в нескольких частях приложения. В коде она описана так:

    StackView {
        id: stackView

        ...

        // Страница с виджетом выбора файла
        Component {
            id: fileSelectDialogComponent

            FileSelect {
                id: fileSelectDialog
                anchors.fill: parent
                enabled: Stack.status === Stack.Active
            }
        }

Выбор файла вызывается так:
// Вызывается диалог выбора файла
qmlGlobalParameters.fileSelectDialogStartDirectory="тут_имя_директории";
qmlGlobalParameters.fileSelectDialogStartFileName="тут_имя_файла";
qmlGlobalParameters.fileSelectDialogResult="";
stackView.push( fileSelectDialogComponent );

Страница выбора файла сама себя закрывает через вызов pop() для stackView при нажатии кнопки Ok или Cancel.

Теперь сами проблемы:

Так как тип Component не позволяет создавать себе свойства, а позволяет только задавать идентификатор id, то я не могу «вытащить» fileSelectDialog как свойство property alias для fileSelectDialogComponent. Поэтому мне приходится передавать параметры в объект fileSelectDialog не напрямую (потому что я достучаться до него не могу), а через глобальный объект qmlGlobalParameters, о котором «знает» и вызывающий код, и сам тип fileSelectDialog. И это мне очень не нравится. Я сделал вот так «чтоб работало», но хочу переделать так, чтобы по нормальному передавать данные в объект, а так же чтобы иметь возможность работать с сигналами этого объекта.

Но пока этого не сделано, мне нужно научиться ловить момент «выталкивания» компонента fileSelectDialogComponent из стека, чтобы обработать сделанный в этом компоненте выбор файла. В StackView нет сигналов, которые бы вызывались при действии pop(). Привязаться к сигналам fileSelectDialog я не могу, потому что он сидит внутри fileSelectDialogComponent, и потому достучаться до него невозможно. У самого типа Component объекта fileSelectDialogComponent тоже нет сигналов, оповещающих о том что он выталкивается из стека. В общем, везде какие-то странные ограничения, из-за которых я не могу поймать момент завершения работы страницы выбора файла.

Вопрос: как можно отловить этот момент в существующей структуре кода? А как можно изменить код, чтобы вышеуказанных проблем не стояло в принципе?

★★★★★

Последнее исправление: Xintrea (всего исправлений: 5)

var prev = stackView.currentItem;
var item = stackView.push(component);

item.StackView.deactivated.connect(function () {
    if (stackView.currentItem === prev) {
        ...
    }
});
eeiaao
()
Ответ на: комментарий от eeiaao

Перечитал портянку, не нужно никакое отлавливавние pop. StackView.push возращает то, что было помещено в стек при вызове. Нужно подписаться на его сигналы.

eeiaao
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.