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

Posted

技术标签:

【中文标题】如何将组件指针从 QML 传递到 C++?【英文标题】:How To Pass Component Pointer From QML To C++? 【发布时间】:2021-09-19 18:51:08 【问题描述】:

将 QML 文件中创建的组件指针传递给 C++ 的最简单方法是什么?从Qt Documentation 的解释中,我们可以获取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 代码传递组件:

main.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++ 函数的相关文档。所以我的问题:

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

Qt:6.2.05.15.2。 编译器:GCC 11.1.0MSVC 2019。 平台:MS WindowsGNU/Linux

【问题讨论】:

为清楚起见,给出的示例不是 组件指针,而是指向对象的指针。您可以通过 QQmlComponent * 就好了,这将允许您根据需要从 C++ 实例化组件(例如 Repeater),但这似乎不是您在这个问题中所关心的 【参考方案1】:

    简单的事情是有争议的,因为它取决于每种情况下容易或困难的定义,所以我不会回答这个问题,因为它不属于 SO。

    是的,可以将任何 QML 对象导出到 C++。 id 是对对象的引用,因此您没有传递名称“testItemId”,而是传递了一个具有标识符“testItemId”的test_item 对象。

注意:建议不要将任何 QML 对象暴露给 C++(或在最短的时间内这样做),因为它的生命周期是由 QML 管理的,因此它可能随时被消除,从而导致您访问不存在的指针不再有关联的对象。 .

【讨论】:

能否请您添加有关将组件 ID 从 QML 传递到 C++ 的文档的参考? @GhasemRamezani 见doc.qt.io/qt-5/… 是的,在这个例子中,你可能最好在 QML 端连接一个 C++ 信号

以上是关于如何将组件指针从 QML 传递到 C++?的主要内容,如果未能解决你的问题,请参考以下文章

QT怎样将一个结构体作为函数参数从C++传递到QML

将 QObject 指针从 QML 对象传递给 C++

如何将指针从 void 函数传递到另一个 C++

如何将委托或函数指针从 C# 传递到 C++ 并使用 InternalCall 调用它

将二进制数据从 QML 传递到 C++

如何检索 QML 相机提要并发送到 C++ 后端