x
25 декабря 2018 г. 11:07

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

qt, qml, pop, стек, stackview

Все приложение у меня построено на 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 тоже нет сигналов, оповещающих о том что он выталкивается из стека. В общем, везде какие-то странные ограничения, из-за которых я не могу поймать момент завершения работы страницы выбора файла.

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
1

Добрый день!

Лично я стараюсь избегать использования Component, по крайней мере в том виде, как вы его используете. Вы уже сказали о его главных проблемах. Крайне неудобная штука.

Как вариант можно попытаться избавиться от него вовсе. Для этого создайте qml файл, который выполняет роль этого компонента, то есть пишите в том qml файле

Item {
    // Содержимое
}

В содержимое помещаете информацию, которая есть в вашем делегате.

А далее нужно реализовать логику по созданию объекта с этой информацией в qml части. Это можно сделать так, как реализовано вот в этом уроке по динамическому созданию объектов в QML

Для вас в том уроке наибольший интерес представляет файл logic.js , в котором создаются объекты из qml файла. Смотрите функцию createTarget.
Смысл будет похожим на то, что вам нужно, вам возможно только придётся несколько иначе перенастроить парента, а также якоре и т.д.

При этом можно будет без проблем достучаться до свойств объекта через алиасы, а также добавить его в массив момимо StackView, если потребуется.

А что касается pop, то думаю, что если вы реализуете без Componentа, то вам уже не нужно будет это всё отлавливать.

0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
G
24 июля 2019 г. 4:20
G0tzef

C++ - Тест 005. Структуры и Классы

  • Результат:66баллов,
  • Очки рейтинга-1
VK
24 июля 2019 г. 3:49
Viktoriia Komarova

C++ - Тест 001. Первая программа и типы данных

  • Результат:40баллов,
  • Очки рейтинга-8
G
24 июля 2019 г. 3:25
G0tzef

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
Последние комментарии
23 июля 2019 г. 12:14
IscanderChe

Вот ссылка: https://github.com/iscander-che/TestReportViewer .
23 июля 2019 г. 5:42
Евгений Легоцкой

Хорошо, хотя конечно это С, а не С++ )))) Но если вдруг будут проблемы, то решение через класс со статическими переменными вы видели ))
23 июля 2019 г. 5:33
IscanderChe

"Не потребует каждый раз объявлять extern в других файлах". И так не требует. У меня в тестовом классе эти переменные используются без дополнительного объявления. Так же объявил их в cpp-файле о…
23 июля 2019 г. 5:28
IscanderChe

В репозиторий могу сегодня вечером выложить. "Или ее надо компилить самому под дистриб?" Тут я не совсем понимаю, что вы имеете ввиду. Я выложу в репозиторий исходный код утилиты, и всё.
23 июля 2019 г. 4:32
Евгений Легоцкой

Есть комментарий по вашему коду. Лучше бы вместо глобальных переменных в стиле Си, то есть с использоавнием extern, написали бы статические переменные в рамках класса. IMHO - это будет выглядеть…
Сейчас обсуждают на форуме
24 июля 2019 г. 4:57
Михаиллл

Это не помогает. Ниже мой код Rectangle{ //Flickable { //contentX: 100 id: rectangleForListView y: parent.height * 0.15 height: parent.height * 0.…
24 июля 2019 г. 3:17
Евгений Легоцкой

Ну вот теперь я несколько в ступоре. Запустите из консоли проект и посмотрите тогда, на что ругается. Также, следовало бы посмотреть в настройках самой виртуальной машины, что по поддержке OpenG…
23 июля 2019 г. 8:20
Михаиллл

Так работает QFile f1(dbAdress); f1.setPermissions(QFileDevice::WriteOther);
23 июля 2019 г. 7:11
Pavel K.

Советую использовать нечто такое или такое
22 июля 2019 г. 10:50
Pavel K.

Благодарю.Буду пробовать.
Ищу работу?
5,000.00 руб. - 15,000.00 руб.
Дизайнер
Moskovskiy, Moscow, Russia
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

EVILEG
О нас
Услуги
Присоединяйтесь к нам
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB