Делая это:
// Using QQuickView
QQmlEngine engine;
QQmlComponent component(&engine,QUrl(QStringLiteral("qrc:/Map.qml")));
QObject *object = component.create();
QObject *map = object->children().at(1);
Вы создаете новый локальный экземпляр своего представления.Таким образом, вы не изменяете текущее представление.
Самым простым способом отправки данных в ваше представление является использование сигналов / слотов.Или вы можете передать указатель на ваш компонент на MainWindow
:
Например:
ApplicationWindow {
visible: true
width: 640
height: 480
property int foobar: -1
Label {
text: foobar
}
}
class Worker: public QObject
{
public:
Worker(QObject* map): QObject(),
map(map)
{
startTimer(500);
}
void timerEvent(QTimerEvent* ev)
{
static int i = 0;
++i;
map->setProperty("foobar", i);
}
private:
QObject* map;
};
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
QObject* obj = engine.rootObjects().first();
Worker* worker = new Worker(obj);
return app.exec();
}
Быстрый пример с сигналами / слотами (полезно, когда класс Worker
не должен знать внутренний компонент):
ApplicationWindow {
visible: true
width: 640
height: 480
function update(value) {
label.text = value;
}
Label {
id: label
text: "None"
}
}
class Worker: public QObject
{
Q_OBJECT
public:
Worker(): QObject()
{
startTimer(500);
}
void timerEvent(QTimerEvent* ev)
{
static int i = 0;
++i;
emit update(i);
}
signals:
void update(QVariant newValue);
};
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
QObject* obj = engine.rootObjects().first();
Worker* worker = new Worker();
QObject::connect(worker, SIGNAL(update(QVariant)), obj, SLOT(update(QVariant)));
return app.exec();
}