2012-08-04 35 views
6

我在写一个QML + Qt应用程序。 予定义的类是这样的:如何将C++模型公开到QML

class MainClass : public QObject 
{ 
    Q_OBJECT 

public: 
    rosterItemModel m_rosterItemModel; 
. 
. 
. 
} 

rosterItemModel模型是从QAbstractListModel派生的类。 我暴露MainClass使用此功能QML部分:

qmlRegisterType<MainClass>("CPPIntegrate", 1, 0, "MainClass"); 

现在我想从分配这个MainClass模型(m_rosterItemModel)模型在QML一个ListView的财产。 我尝试以下方法,但他们都不是有帮助:(

  • 我想声明m_rosterItemModel作为使用Q_PROPERTY的属性。 我不能这样做,因为它说,QAbstractListModel不是 复制能力。
  • 我试着使用MainClass一个 Q_INVOKABLE函数来获得一个指向m_rosterItemModel在QML文件,但它不是也有帮助。

有人能帮助我吗?

回答

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() 
+0

我使用qmlRegisterType在注册MainClass到QML为了在QML中轻松使用MainClass信号和插槽,可以通过创建MainClass {id:mc}这样的实例来实现。无论如何。谢谢你:) – saeed 2012-08-04 07:05:56

+2

从经验看来,在第二种情况下在necassary注册了模型类:'qmlRegisterType (“CPPIntegrate”,1,0,“MainClass”);'另外,使用'const'修改器似乎打破了互操作。最后一个古怪的位是在头的Q_PROPERTY和Q_INVOKABLE声明中始终引用具有完整名称空间限定的类。此外,如果有人试图返回一些基类(如QAbstractItemModel)指针,互操作性将再次失败,所以要小心。 – mlvljr 2012-08-05 15:07:44

+0

如何获取mainClassInstance? – Brent81 2013-02-23 14:39:10