3

Christophe Dumezのブログの記事を大まかにフォローして、データをQML(QtQuick2)インターフェイス(QtQuick2ApplicationViewer)に公開するカスタムQAbstractListModelクラスを取得しました。ただし、私はQt 5.0.0(およびMSVC2012)を使用しているため、彼の記事には適用されない部分がいくつかあります。たとえば、Qt 5で減価償却されsetRoleNames()たため、ListModelコンストラクターはを呼び出す必要がなくなりました。setRoleNames()

ListModel::ListModel(ListItem* prototype, QObject *parent) :
    QAbstractListModel(parent), m_prototype(prototype)
{
  setRoleNames(m_prototype->roleNames());
}

Qt 5で純粋仮想関数に変更されたため、 QAbstractListModelから継承するクラスは、を定義するだけでよいと理解しています。したがって、彼の例では、コンストラクターでroleNames()コメントアウトするだけで、すべてが機能するはずです。setRoleNames(m_prototype->roleNames());右?

ただし、代わりに、QMLを介してアクセスすると、定義されたすべてのロールが未定義になります。私はこれでC++の名前をチェックすることができます:

QHash<int, QByteArray> mynames = model->find("Elephant")->roleNames();
qDebug() << "Model: " << mynames;

この場合、Elephantオブジェクトのロール名は期待どおりに出力されます。

私の仮定は正しいですか、それともQAbstractListModelオブジェクトを取得してリスト要素のプロパティをQML2と共有するために何か他のことをする必要がありますか?これはばかげた質問のように思えますが、Qt5のドキュメントは現在非常に壊れているため、理解できません。

ありがとう!

4

1 に答える 1

9

メソッドを再実装する必要がQAbstractListModel::roleNames() constあり、ロールは自動的にQMLに登録されます。

examples / quick / modelviews / abstractitemmodelに、QAbstractListModelベースのモデルをQMLに公開する実例があります。

QQmlListPropertyの使用を検討することもできます。

于 2012-12-25T14:25:58.463 に答える