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

У меня есть следующая структура каталогов:

ui/
  |- resources.qrc
  |- qml/
    |- main_window_presenter.qml
    |- MyPresenter.qml

resources.qrc содержание:

<RCC>
    <qresource prefix="/">
        <file>qml/MyPresenter.qml</file>
        <file>qml/main_window_presenter.qml</file>
    </qresource>
</RCC>

Содержимое MyPresenter.qml:

import QtQuick 2.11

FocusScope {
  id: root

  property Item view
  property QtObject model

  Component.onCompleted: {
    root.view.anchors.fill = root
    root.view.focus = true
  }
}

main_window_presenter.qml содержание:

import "."

MyPresenter {
  id: root
}

содержимое main.cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>

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

  QQmlApplicationEngine engine;
  engine.load(":/qml/main_window_presenter.qml");

  return app.exec();
}

Когда я запускаю приложение, я получаю

QQmlApplicationEngine failed to load component
file::/qml/main_window_presenter.qml:1 import "." has no qmldir and no namespace

Если я удалю import "." на main_window_presenter.qml я получаю

QQmlApplicationEngine failed to load component                                                                                                                             
file::/qml/main_window_presenter.qml:3 MyPresenter is not a type

Я думаю, что мне не нужен оператор импорта, потому что они находятся в одном каталоге. Я использую систему сборки meson с этой соответствующей частью в meson.build(exe_moc_headers определены ранее):

qt5_module = import('qt5')
exe_processed = qt5_module.preprocess(moc_headers : exe_moc_headers, qresources : 'ui/resources.qrc')

1 ответ

Решение

Как предложил @eyllanesc, вместо QQmlApplicationEngine работает QQuickView:

#include <QGuiApplication>
#include <QQuickView>

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

  QQuickView* view{new QQuickView};
  view->setSource(QUrl("qrc:///qml/main_window_presenter.qml"));
  view->show();

  return app.exec();
}

Я мог бы понять это сам, если бы сообщение об ошибке не указывало, что тип не найден, говоря: "MyPresenter не является типом". Это привело меня к мысли, что это вопрос ссылок.

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