Я пытаюсь написать плагин, содержащий некоторые файлы QML и некоторые классы C ++, которые предоставляют функциональные возможности более низкого уровня и взаимодействуют с другим приложением. Они используются компонентами QML. Я хочу иметь возможность управлять временем жизни этих объектов C ++ из QML (то есть они должны создаваться при загрузке и уничтожении файла QML при уничтожении QML), при этом все еще имея возможность имитировать объекты C ++.
Я пробовал несколько разных подходов. В идеале результатом будет то, что я смогу использовать qmlscene
в файле QML, который я хочу редактировать, и рядом с этим файлом будет папка dummydata
, содержащая макет для экземпляра класса C ++. Если я попробую это с использованием qmlRegisterType
в классе плагина, который наследуется от QQmlExtensionPlugin
(аналогично примеру в https://qmlbook.github.io/ch17-extensions/extensions.html),, и я передам результирующую библиотеку qmlscene
, файл QML не будет использовать макет, но вместо этого создайте экземпляр объекта C ++. Это означает, что иногда мне нужно запустить немало логики, чтобы добавить некоторые максимизированные данные в мой файл QML.
Это похоже на пример в «Книге QML». предлагает полностью спроектировать компонент QML с макетом, прежде чем вводить какой-либо C ++ в QML. Есть ли способ сделать это более устойчивым? Думаю, я мог бы избежать использования qmlRegisterType
для класса C ++, который я хочу на некоторое время смоделировать,закомментировав соответствующую строку, но я бы не хотел этого делать.
Другой подход, который я пробовал, заключался в использовании QQMLContext::setContextProperty
из класса центрального контроллера C ++. Это позволяет мне передавать объект C ++ вQML из C ++, а также использовать dummydata, однако время жизни объекта будет управляться не компонентом QML, а из C ++. Кроме того, каждый класс должен потенциальносоздание экземпляра несколько раз и правильное подключение сигналов довольно подвержено ошибкам. Это то, что я нашел до сих пор:
auto proxy = std::make_shared<Proxy>();
//make `proxy` object known in QML realm
_qmlEngine.rootContext()->setContextProperty("proxy", proxy.get());
connect(&_qmlEngine, &QQmlApplicationEngine::objectCreated,
[&proxy](QObject *object, const QUrl &url) {
if (url == QUrl("qrc:/imports/Common/TestWindow.qml")) {
// make sure the proxy is not destroyed when leaving scope of this function
connect(qobject_cast<QQuickWindow *>(object),
&QWindow::visibilityChanged, // as a dirty workaround for missing QWindow::closing signal
[proxy]() mutable { proxy.reset(); }); // delete proxy when closing TestWindow
}
});
_qmlEngine.load(QUrl("qrc:/imports/Common/TestWindow.qml"));
Есть ли "удобный" способ для имитации данных, созданных в QML и исходящих из C ++, или, по крайней мере, есть хороший способ добавить время жизнитакой объект C ++ для времени жизни объекта QML?