Как установить свойства QML из переполнения стека

Я пытаюсь сделать простую задачу, как изменение свойства (text:) некоторого объекта QML из C ++, но у меня ничего не получается. Любая помощь приветствуется.

Я не получаю никаких ошибок, окно появляется, только текстовое свойство не изменяется как (по крайней мере, я думаю) это должно.
Даже что-то, что я НЕ делаю здесь неправильно? !!

Что я пытался это:

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include <QQuickItem>
#include <QQmlEngine>
#include <QQmlComponent>
#include <QString>

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

QQmlApplicationEngine engine;QQmlComponent component(&engine, QUrl::fromLocalFile("main.qml"));
QObject *object = component.create();

engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QString thisString = "Dr. Perry Cox";

object->setProperty("text", thisString);  //<--- tried  instead of thisString putting "Dr. ..." but nope.
delete object;return app.exec();
}

main.qml

import QtQuick 2.2
import QtQuick.Window 2.1

Window {
visible: true
width: 360
height: 360

MouseArea {
anchors.fill: parent
onClicked: {
Qt.quit();
}
}

Text {
id: whot
text: ""anchors.centerIn: parent
font.pixelSize: 20
color: "green"}
}

1

Решение

Когда вы звоните QObject *object = component.create(); вы получаете доступ к корневому контексту, который является Window компонент и его свойства.

Чтобы получить доступ к Text Свойства, вы можете создать псевдоним свойства, как это:

Window {
property alias text: whot.text
...
Text {
id: whot
text: ""...
}
}

Это даст вам доступ к whot«s text собственность изнутри Windowконтекст.

Есть еще один более округлый путь. приписывать objectName собственность вместо id (или оба, если вам все еще нужно id) чтобы whot:

Text {
id: whot // <--- optional
objectName: "whot" // <--- required
text: ""...
}

Теперь вы можете сделать это в коде:

QObject *whot = object->findChild<QObject*>("whot");
if (whot)
whot->setProperty("text", thisString);

На заметку: я не думаю, что вы должны удалить object пока после звонка app.exec(), Иначе, это будет … хорошо, будет удалено. 🙂

4

Другие решения

#include <QQmlContext>
#include <qquickview.h>
#include <qdir.h>

QQmlApplicationEngine engine;
QString root = QCoreApplication::applicationDirPath();
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
QObject *topLevel = engine.rootObjects().value(0);
QQuickWindow *window = qobject_cast<QQuickWindow*>(topLevel);
window->setProperty("root", root);

для qml

ApplicationWindow  {
property string root
onRootChanged: {
console.log("root : "+ root);
}
}
0

По вопросам рекламы [email protected]