Russian Qt Forum

Qt => Qt Quick => Тема начата: AkonResumed от Март 16, 2021, 19:33



Название: Показ модального диалога с последующим удалением
Отправлено: AkonResumed от Март 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
}
?





Название: Re: Показ модального диалога с последующим удалением
Отправлено: AkonResumed от Апрель 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)
            }
        }
    }
}


Название: Re: Показ модального диалога с последующим удалением
Отправлено: AkonResumed от Апрель 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()
...