8

我正在编写一个 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 不可复制。
  • 我尝试使用 MainClass 中的 Q_INVOKABLE 函数在 qml 文件中获取指向 m_rosterItemModel 的指针。但这也没有帮助。

有人可以帮助我吗?

4

1 回答 1

8

不需要任何元类型注册。您需要做的就是调用 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()
于 2012-08-04T06:43:06.380 回答