从C ++更新QML对象的正确方法?

问题描述 投票:0回答:1

我已经找到了这个How to modify a QML Text from C++,但我听说从C ++更新像这样的QML对象不是线程安全的

这样做的正确方法是什么?

我认为最简单的示例(文本小部件)足以让我理解。

c++ qt qml qtquick2
1个回答
0
投票

注意:我没有指出此代码不是线程安全的,我已经指出您在your previous question中的代码也不是线程安全的,因为您是从不同于线程的线程修改GUI的它属于。

我已经指出this answer的代码很危险,因此不建议使用,因为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" text: helper.text font.pixelSize: 12 }

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

© www.soinside.com 2019 - 2024. All rights reserved.