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はコピー構築可能ではなく、それらをコピーするとセマンティクスが壊れるため(「ID」があるため)、ポインターによることが重要です。

モデルを直接登録する代わりに、メイン クラスのインスタンスを登録し、Q_INVOKABLE を使用することもできます。メインクラス:

Q_INVOKABLE RosterItemModel* rosterItemModel() const;

mainClass のインスタンスを登録します (mainClassInstance は再びポインターであると見なされます)。

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

QML では:

model: _mainInstance.rosterItemModel()
于 2012-08-04T06:43:06.380 に答える