qml читать переменные из c ++? - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь установить размер applicationwindow {} для моего Android-APK, поэтому я хочу прочитать значения из файла cpp:

main.cpp:

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QScreen *screen = QApplication::screens().at(0);
    QVariant sz_width = screen->availableSize().width();
    QVariant sz_height = screen->availableSize().height();

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

затем из qmlфайл для чтения (main.qml):

ApplicationWindow {
    id: mainWindow
    visible: true
    width: sz_width
    height: sz_height 
}

это для того, чтобы легко манипулировать со всеми размерами объектов позже в qml, поэтому, например, я использую размер шрифта с помощью mainWindow * 0.5, чтобы я могиметь правильный размер шрифта для каждого разрешения приложения, но он работает только в том случае, если я действительно установил переменные width и height ...

Возможно, это решение довольно "болезненное", но я бы хотел сделать этотаким образом, если вы можете помочь мне с правильным синтаксисом ...

Спасибо

1 Ответ

0 голосов
/ 10 февраля 2019

Чтобы быстро сделать значения C ++ видимыми в QML, вы можете установить их как свойство контекста :

QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("screenWidth", sz_width);
engine.rootContext()->setContextProperty("screenHeight", sz_height);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

После этого переменные будут доступны в QML по кавычкам ("screenWidth""и" screenHeight ") (они также могут соответствовать имени переменной C ++, если вы предпочитаете).

QSize тип также распознается QML , так что вы можете просто установить размер какодна переменная.

engine.rootContext()->setContextProperty("screenSize", screen->availableSize());

Также в этом случае искомая информация уже доступна в QML ... проверьте прикрепленный объект Screen , а такжеобъект / свойство Qt.application.screens для списка доступных экранов.

ДОБАВЛЕНО:

Поскольку в связанной документации это не упоминается напрямую, оно должно бытьотметил, что переменные свойства контекста, установленные таким образом, не имеют сигналов уведомлений об изменениях.Поэтому они не обновляются автоматически в QML, в отличие от других «привязываемых» свойств.Единственный способ заставить QML автоматически обновлять значение - это снова установить свойство контекста (или создать некоторый сигнал, к которому QML может подключиться и заставить его перечитать значение).

Я не могу найтигде именно это упоминается в документации Qt, но страница QQmlContext предоставляет (тонкий) ключ:

Свойства контекста определяются и обновляются путем вызова QQmlContext :: setContextProperty ().

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