如何将C++模型公开给QML

s4e*_*eed 6 qt qml qt-quick

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

class MainClass : public QObject
{
    Q_OBJECT

public:
    rosterItemModel m_rosterItemModel;
.
.
.
}
Run Code Online (Sandbox Code Playgroud)

rosterItemModel模型是从QAbstractListModel派生的类.我使用这个函数将MainClass暴露给qml部分:

qmlRegisterType<MainClass>("CPPIntegrate", 1, 0, "MainClass");
Run Code Online (Sandbox Code Playgroud)

现在我想将这个模型(m_rosterItemModel)从MainClass分配给QML中的ListView的模型属性.我尝试了以下方法,但没有一个是有用的:(

  • 我尝试使用Q_PROPERTY将m_rosterItemModel声明为PROPERTY.我不能这样做,因为它说QAbstractListModel不可复制.
  • 我试图使用MainClass中的Q_INVOKABLE函数在qml文件中获取指向m_rosterItemModel的指针.但它也没有用.

有人能帮助我吗?

Fra*_*eld 6

不应该有任何元数据注册.您需要的只是调用setContextProperty并通过指针传递模型:

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

在QML中使用它:

model: _rosterItemModel
Run Code Online (Sandbox Code Playgroud)

指针很重要,因为QObject不是可复制构造的,复制它们会破坏它们的语义(因为它们具有"身份").

直接注册模型的替代方法是注册主类的实例并使用Q_INVOKABLE.在MainClass中:

Q_INVOKABLE RosterItemModel* rosterItemModel() const;
Run Code Online (Sandbox Code Playgroud)

注册mainClass的实例(mainClassInstance再次被假定为指针):

context->setContextProperty( "_mainInstance", mainClassInstance );
Run Code Online (Sandbox Code Playgroud)

在QML中:

model: _mainInstance.rosterItemModel()
Run Code Online (Sandbox Code Playgroud)

  • 看来,从经验,在第二种情况下登记在necassary模型类太:`qmlRegisterType <rosterItemModel>( "CPPIntegrate",1,0, "MainClass");`此外,使用`const`改性剂似乎打破互操作.最后一个古怪的位是始终在头的Q_PROPERTY和Q_INVOKABLE声明中引用具有完整命名空间限定的类.此外,如果一个人拒绝返回一些基类(如QAbstractItemModel)指针,互操作性将再次失败,所以要小心. (2认同)