gpt4 book ai didi

qt - 如何将 C++ 模型暴露给 QML

转载 作者:行者123 更新时间:2023-12-04 15:01:53 26 4
gpt4 key购买 nike

我正在编写 QML+Qt 应用程序。
我定义了一个这样的类:

class MainClass : public QObject
{
Q_OBJECT

public:
rosterItemModel m_rosterItemModel;
.
.
.
}

rosterItemModel 模型是从 QAbstractListModel 派生的类。
我使用这个函数将 MainClass 暴露给 qml 部分:
qmlRegisterType<MainClass>("CPPIntegrate", 1, 0, "MainClass");

现在我想将此模型(m_rosterItemModel)从 MainClass 分配给 QML 中 ListView 的模型属性。
我尝试了以下方法,但都没有帮助:(
  • 我尝试使用 Q_PROPERTY 将 m_rosterItemModel 声明为 PROPERTY。
    我不能这样做,因为它说 QAbstractListModel 不是
    可复制。
  • 我试图使用一个指向 qml 文件中的 m_rosterItemModel 的指针
    MainClass 中的 Q_INVOKABLE 函数。但这也没有帮助。

  • 有人可以帮助我吗?

    最佳答案

    不需要任何元类型注册。
    您只需要调用 setContextProperty 并通过指针传递模型:

    QQmlContext* context = view->rootContext(); //view is the QDeclarativeView
    context->setContextProperty( "_rosterItemModel", &mainClassInstance->m_rosterItemModel );

    在 QML 中使用它:
    model: _rosterItemModel

    通过指针很重要,因为 QObject 不是可复制构造的,并且复制它们无论如何都会破坏它们的语义(因为它们具有“身份”)。

    直接注册模型的替代方法是注册主类的实例并使用 Q_INVOKABLE。在主类中:
    Q_INVOKABLE RosterItemModel* rosterItemModel() const;

    注册一个 mainClass 的实例(mainClassInstance 又被假定为一个指针):
    context->setContextProperty( "_mainInstance", mainClassInstance );

    在 QML 中:
    model: _mainInstance.rosterItemModel()

    关于qt - 如何将 C++ 模型暴露给 QML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11806324/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com