Связь страниц Qt / QML MainWindow и StackView с использованием сигналов или глобальных переменных - PullRequest
1 голос
/ 05 мая 2020

Я хотел бы реализовать обработчики ключей для разных страниц StackView. Проблема со StackView заключается в том, что он использует атрибут «item» для отображения qml-страницы. Следовательно, то, что объявлено на странице StackView (например, HomePage.qml), поскольку она не создается явно, не отображается в main.qml.

Чтобы решить эту проблему, я пытаюсь объявить сигнал в окне и разместите его обратный вызов на странице StackView (это глупо, но, пожалуйста, предложите, что еще делать). Вот как это примерно выглядит:

main.qml
-----------
Window {
    id: window

    signal keyReceived();
    property var key;

    StackView {
        id:stackView
        initialItem: "HomePage.qml"
    }
}

HomePage.qml
-------------
Page {
    id: homePage
    window.onKeyReceived:{
         // Here "window" is not recognized, since this type of use does not exist?
    }
}

В общем, я хочу иметь возможность объявить глобальную переменную, которая видна как в main.qml, так и в HomePage.qml, и иметь возможность получать уведомления от изменяет эту переменную. Будь то сигналы или другие вещи, не имеет значения. Любая помощь приветствуется.

1 Ответ

1 голос
/ 05 мая 2020

Здесь вы go:

Page {
    id: homePage
    Connections {
        target: window
        onKeyReceived: {
        }
    }
}

Причина, по которой это будет работать, заключается в том, что он использует цепочку контекста QML во время выполнения через StackView до Window для разрешения ссылки window id .

Причина, по которой ваш первый подход не работает, заключается в том, что ссылки на обработчики сигналов выше текущего типа не разрешаются статически. Т.е. QML не знает, кто будет родителем Page во время выполнения, поэтому он не может разрешить тип window и, следовательно, не может разрешить тип и аргументы сигнала keyReceived. Такие ссылки работают только для текущего типа и всех дочерних элементов, статически определенных под ним. ссылка вверх по контекстной цепочке), вы должны использовать объект Connections, который будет вычислять все это во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...