我已经找到了这个How to modify a QML Text from C++,但我听说从C ++更新像这样的QML对象不是线程安全的
这样做的正确方法是什么?
我认为最简单的示例(文本小部件)足以让我理解。
注意:我没有指出此代码不是线程安全的,我已经指出您在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 }