如何将组件指针从 QML 传递到 C++?
How To Pass Component Pointer From QML To C++?
将在 QML 文件中创建的组件指针传递给 C++ 的最简单方法是什么?根据 Qt Documentation 的解释,我们可以获取 QML 文件根对象,然后搜索我们的组件 objectName
。但是很难在 C++ 代码和 QML 代码中保持组件同步 objectName
:
仅供 Copy/Paste: 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 代码传递组件:
main.qml (copy/paste:qml_pass_id_example/main.qml)
TestItem
{
id: testItemId;
Component.onCompleted: controller.setup_test(testItemId);
}
main.cpp (对于 copy/paste: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++ 函数的相关文档。所以我的问题:
- 将 QML 组件指针传递给 C++ 的最简单方法是什么?
- 将 QML 组件 ID 作为组件 C++ 类型指针传递给 C++ 函数是否有效?
- Qt:6.2.0 和 5.15.2.
- 编译器:GCC 11.1.0 和 MSVC 2019.
- 平台:MS Windows 和 GNU/Linux
容易的事情值得商榷,因为它取决于每种情况下容易或困难的定义,所以我不会回答这个问题,因为它不属于 SO。
是的,将任何QML对象导出到C++都是有效的。 id 是对对象的引用,因此您没有传递名称“testItemId”,而是传递了一个 test_item
具有标识符“testItemId”的对象。
注意:建议不要将任何 QML 对象暴露给 C++(或至少暴露一次),因为它的生命周期由 QML 管理,因此它可能随时被消除,导致您访问指针不再有关联的对象。 .
将在 QML 文件中创建的组件指针传递给 C++ 的最简单方法是什么?根据 Qt Documentation 的解释,我们可以获取 QML 文件根对象,然后搜索我们的组件 objectName
。但是很难在 C++ 代码和 QML 代码中保持组件同步 objectName
:
仅供 Copy/Paste: 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 代码传递组件:
main.qml (copy/paste:qml_pass_id_example/main.qml)
TestItem
{
id: testItemId;
Component.onCompleted: controller.setup_test(testItemId);
}
main.cpp (对于 copy/paste: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++ 函数的相关文档。所以我的问题:
- 将 QML 组件指针传递给 C++ 的最简单方法是什么?
- 将 QML 组件 ID 作为组件 C++ 类型指针传递给 C++ 函数是否有效?
- Qt:6.2.0 和 5.15.2.
- 编译器:GCC 11.1.0 和 MSVC 2019.
- 平台:MS Windows 和 GNU/Linux
容易的事情值得商榷,因为它取决于每种情况下容易或困难的定义,所以我不会回答这个问题,因为它不属于 SO。
是的,将任何QML对象导出到C++都是有效的。 id 是对对象的引用,因此您没有传递名称“testItemId”,而是传递了一个
test_item
具有标识符“testItemId”的对象。
注意:建议不要将任何 QML 对象暴露给 C++(或至少暴露一次),因为它的生命周期由 QML 管理,因此它可能随时被消除,导致您访问指针不再有关联的对象。 .