Я пытаюсь сделать простую задачу, как изменение свойства (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"}
}
Когда вы звоните 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()
, Иначе, это будет … хорошо, будет удалено. 🙂
#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);
}
}