У нас есть существующий проект QT, написанный на C ++, и мы хотим добавить что-то вроде примера проекта mapViewer в наш существующий пользовательский интерфейс. Мы не можем понять, как создать экземпляр mapViewer и вызвать метод, который его инициализирует / отображает. Следуя интерактивной справке, мы пришли к следующей функции, которая возвращает QQuickWidget, который мы можем добавить к элементу пользовательского интерфейса. Мы продолжаем получать сообщение об ошибке, что созданный компонент никогда не будет готов, поэтому функция не работает.
QQuickWidget *buildMap(QWidget *parent)
{
QQmlEngine *engine = new QQmlEngine;
QQmlComponent component(engine, "qrc://mapviewer.qml");
QObject *object = component.create();
QMetaObject::invokeMethod(object, "initializeMap");
QQuickWidget *map = new QQuickWidget(engine, parent);
return map;
}
Для нас не имеет большого смысла, что мы создаем объект с использованием компонента mapViewer, а затем просто забываем об этом, но примеры, которые мы нашли в Интернете, имеют поток, подобный этому.
Попробуйте что-то вроде этого:
QQuickWidget *buildMap(QWidget *parent) {
QQuickWidget *map = new QQuickWidget(parent);
map->setSource(QUrl("qrc://mapviewer.qml"));
map->show();
return map;
}
Для initializeMap
метод, может быть, позвонить в mapviewer.qml
«s onCompleted
? Если вы настаиваете на том, чтобы вызывать его из C ++, вы все равно можете добраться до объекта через map->rootObject()
Кроме того, при создании компонентов и объектов, будь то из C ++ или QML, всегда неплохо проверять строки ошибок состояния и вывода, если таковые имеются, вы не просто предполагаете, что все будет работать, а затем удивляетесь, почему это не так ,
Других решений пока нет …