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

时间:2012-08-04 05:55:35

标签: qt qml qt-quick

我正在编写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不是 拷贝能力。
  • 我尝试使用a在qml文件中获取指向m_rosterItemModel的指针 MainClass中的Q_INVOKABLE函数。但它也没有用。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:6)

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

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

在QML中使用它:

model: _rosterItemModel

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

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

Q_INVOKABLE RosterItemModel* rosterItemModel() const;

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

context->setContextProperty( "_mainInstance", mainClassInstance );

在QML中:

model: _mainInstance.rosterItemModel()