如何将组件指针从QML传递到c++ ?

  • 本文关键字:c++ QML 组件 指针 c++ qt qml
  • 更新时间 :
  • 英文 :


传递在QML文件中创建的组件指针到c++的最简单方法是什么?从Qt文档解释中,我们可以获取QML文件根对象,然后搜索我们的组件objectName。但是很难在c++代码和QML代码中保持组件objectName的同步:

仅用于复制/粘贴:qml_pass_objectName_example

auto const root = engine.rootObjects();
if(!root.empty())
{
auto const obj = root.first()->findChild<test_item*>("testItem");
if(obj)
{
c.setup_test(obj);
}
else
{
qDebug() << "Couldn't Cast";
}
}
else
{
qDebug() << "Empty";
}

我试图从Component.onCompleted上的QML代码传递组件:

主要。QML(用于复制/粘贴:qml_pass_id_example/main.qml)
TestItem
{
id: testItemId;
Component.onCompleted: controller.setup_test(testItemId);
}
main.cpp(用于复制/粘贴:qml_pass_id_example/main.cpp)
class controller : public QObject
{
Q_OBJECT
public slots:
Q_INVOKABLE void setup_test(test_item* item)
{
item->f();
}
};
#include "main.moc"
int main(int argc, char* argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
controller c;
qmlRegisterType<test_item>("qml.pass.id", 1, 0, "TestItem");
engine.rootContext()->setContextProperty("controller", &c);
engine.load("qrc:/qml_pass_id_example/main.qml");
return app.exec();
}

我认为这比使用objectName简单得多,但我找不到任何有关将组件的ID传递给c++函数的相关文档。所以我的问题是:

  1. 传递QML组件指针到c++的最简单方法是什么?
  2. 是否将QML组件ID作为组件c++类型指针传递给c++函数有效?

  • Qt:6.2.05.15.2
  • 编译器:GCC 11.1.0MSVC 2019.
  • 平台:MS WindowsGNU/Linux
  1. 简单的事情是有争议的,因为它取决于对每种情况的简单或困难的定义,所以我不会回答这个问题,因为它不在so范围内。

  2. 是的,可以将任何QML对象导出为c++。id是对对象的引用所以你没有传递名称" testtemid "但是你正在传递一个test_item对象,它的标识符为" testtemid "

注意:建议不要将任何QML对象暴露给c++(或至少在一段时间内),因为它的生命周期是由QML管理的,所以它可以在任何时候被消除,导致您访问不再具有关联对象的指针。

最新更新