Правильный способ обновления объекта QML из C ++? - PullRequest
0 голосов
/ 12 марта 2020

Я нашел это Как изменить текст QML из C ++ , но я слышал, что обновление объектов QML небезопасно, например, из C ++

Что такое правильный способ сделать это?

Я думаю, что для меня достаточно простейшего примера (текстового виджета).

1 Ответ

1 голос
/ 12 марта 2020

Примечание: Я не указал, что этот код не является поточно-ориентированным, я указал, что ваш код в ваш предыдущий вопрос не является поточно-ориентированным, так как вы изменяете GUI из другого потока, чем тот, к которому он принадлежит.

Я указал, что код этого ответа опасен и не рекомендуется, поскольку разработчик не управляет жизненным циклом элементов QML, и механизм QML может устранить их без уведомления нам, поэтому я рекомендую создать QObject для получения или отправки информации между C ++ и QML.

main. cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

class Helper: public QObject{
    Q_OBJECT
    Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
    QString m_text;
public:
    using QObject::QObject;
    QString text() const{
        return m_text;
    }
public slots:
    void setText(QString text){
        if (m_text == text)
            return;
        m_text = text;
        emit textChanged(m_text);
    }
signals:
    void textChanged(QString text);
};

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    Helper helper;
    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("helper", &helper);

    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    helper.setText("Change you text here...");

    return app.exec();
}
#include "main.moc"

main.qml

Text {
    id: text1
    color: "red"
    <b>text: helper.text</b>
    font.pixelSize: 12
}

или

Text {
    id: text1
    color: "red"
    text: "This text should change..."
    font.pixelSize: 12
}
<b>Connections{
    target: helper
    onTextChanged: text1.text = text
}</b>
...