Создание объекта QML в существующем проекте C++ QT

У нас есть существующий проект 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, а затем просто забываем об этом, но примеры, которые мы нашли в Интернете, имеют поток, подобный этому.

1 ответ

Попробуйте что-то вроде этого:

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, всегда неплохо проверять строки ошибок состояния и вывода, если таковые имеются, вы не просто предполагаете, что все это будет работать, а затем удивляетесь, почему это не так.,

Другие вопросы по тегам