Russian Qt Forum
Ноябрь 22, 2024, 20:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Показ модального диалога с последующим удалением  (Прочитано 3055 раз)
AkonResumed
Чайник
*
Offline Offline

Сообщений: 81


Просмотр профиля
« : Март 16, 2021, 19:33 »

Друзья, не особо люблю GUI-программирование, но решил заняться QML.

Задача следующая: когда выбирается пункт меню "О программе..." нужно:
1. Создать диалог (AboutWindow.qml).
2. Отобразить его на экране в модальном режиме.
3. Когда диалог будет закрыть, уничтожить его.

Вот рабочий набросок, но с изъяном - при открытом диалоге и завершении программы (например, на десктопе закрываем главное окно (Alt+F4)) в destroyAboutWindow() диалог уже находится в процессе уничтожения.
 
Код:
ApplicationWindow {
    Menu {
        MenuItem {
            text: qsTr("About...")
            onTriggered: {
                //TODO: At open dialog and app closing: TypeError: Property 'destroy' of object TypeError: Type error is not a function
                function destroyAboutWindow() {
                    object.destroy()
                }

                var component = Qt.createComponent("AboutWindow.qml")
                var object = component.createObject(appWindow)
                console.assert(object)
                object.open()
                object.closed.connect(destroyAboutWindow)
            }
        }
    }
}

Вытекающий подвопрос: как идиоматически воплотить на QML следующую конструкцию (это искусственный пример - просто для иллюстрации):

Код:
void showAboutDialog()
{
auto dialog = new QDialog;
dialog->deleteLater();
dialog->exec();  // blocking call, shows modal dialog with its own event loop
}
?



Записан
AkonResumed
Чайник
*
Offline Offline

Сообщений: 81


Просмотр профиля
« Ответ #1 : Апрель 06, 2021, 09:23 »

Пока что пофиксил в таком духе:
Код:
ApplicationWindow {
    id: appWindow

    Menu {
        MenuItem {
            text: qsTr("About...")
            onTriggered: {
                function destroyAboutWindow() {
    //##note: When the main window is closing at the dialog opened, here the main
                    // window ref. is already nulled. The main window will destroy the dialog while
                    // its own destruction.
    if (appWindow)
object.destroy()
                }

                var component = Qt.createComponent("AboutWindow.qml")
                var object = component.createObject(appWindow)
                console.assert(object)
                object.open()
                object.closed.connect(destroyAboutWindow)
            }
        }
    }
}
Записан
AkonResumed
Чайник
*
Offline Offline

Сообщений: 81


Просмотр профиля
« Ответ #2 : Апрель 06, 2021, 09:29 »

Или, чтобы не зависеть от внешней ссылки (appWindow):
Код:
...
                    //##note: When the main window is closing at the dialog opened, here the dialog
                    // itself is already destroyed, and its properties are 'undefined'.
                    if (typeof object.parent !== 'undefined')
                        object.destroy()
...
« Последнее редактирование: Апрель 06, 2021, 09:37 от AkonResumed » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.15 секунд. Запросов: 22.