QT 5.7、QML、およびC++を試してみるための簡単なプロジェクトを進めています。私はいくつかのボタンを使って項目を追加したり削除したりできる項目のリストを持つ簡単なインターフェースを作りたいと思っています。私は一緒に何かを一緒にしようとしているオンラインの別のガイドを読んできましたが、私は立ち往生し続けています。私はQQmlListProperty<T>
とQAbstractListModel
を使用してみましたが、私は両方のアプローチについて質問があります:私のプロジェクトのためにQML/QTのC++リストからの項目の追加と削除5.7
- が
QQmlListProperty<T>
を使用する権利のことですか私はQAbstractListModel
を使用する必要がありますか? - いずれの場合も、QMLビューにリストが変更されたことを通知するにはどうすればよいですか?
- 私は 'QAbstractListModel'を使用すると、リストに項目を追加したり削除したりする方法を
Q_INVOKABLE
だけ作成する必要がありますか?
以下は、QQmlListProperty<T>
とQAbstractListModel
の両方のコードです。私はこのポストを短く保つためにクラスの実装の大部分を省いていますが、実装が必要な場合は追加することができます。 getItms()
の
QQmlListProperty
アイテムクラス
class PlaylistItemModel : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)
public:
explicit PlaylistItemModel(QObject *parent = 0);
QString getName();
void setName(const QString &name);
signals:
void nameChanged();
public slots:
private:
QString _name;
};
QQmlListProperty
Listクラス
class PlaylistModel : public QObject
{
Q_OBJECT
Q_PROPERTY(QQmlListProperty<PlaylistItemModel> items READ getItems NOTIFY itemsChanged)
public:
explicit PlaylistModel(QObject *parent = 0);
QQmlListProperty<PlaylistItemModel> getItems() const;
Q_INVOKABLE void addItem(PlaylistItemModel *item);
Q_INVOKABLE void removeItem(PlaylistItemModel *item);
Q_INVOKABLE void clearItems();
static void append(QQmlListProperty<PlaylistItemModel> *list, PlaylistItemModel *item);
static PlaylistItemModel* at(QQmlListProperty<PlaylistItemModel> *list, int index);
static int count(QQmlListProperty<PlaylistItemModel> *list);
static void clear(QQmlListProperty<PlaylistItemModel> *list);
signals:
void itemsChanged();
public slots:
private:
QList<PlaylistItemModel*> _items;
};
実装:
QQmlListProperty<PlaylistItemModel> PlaylistModel::getItems() const
{
return QQmlListProperty<PlaylistItemModel>(this, _items, &append, &count, &at, &clear);
}
QAbstractListModel
class MyModel : public QAbstractListModel
{
Q_OBJECT
public:
enum ModelRoles
{
ItemRole = Qt::UserRole + 1
};
MyModel(QObject *parent = 0);
// QAbstractItemModel interface
int rowCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role) const;
QHash<int, QByteArray> roleNames() const;
private:
QList<QString> _listData;
QString itemAt(const QModelIndex &index) const;
};
はありがとうそんなに、それはすごく見え、多くのものをクリアします。 1つの質問: 'MyModel'が' QObjects'のリストを持っていたら(私の質問では 'PlaylistItemModel'に似ています)、どちらのクラスでも何が変わるのでしょうか? –
いいえ、多かれ少なかれ同じように機能します。あなたはQVectorを持っていて、あなたのデータ関数にはそれらのプロパティにアクセスします。 –
あなたのアイテムが 'QObject'ベースの場合、モデルはQObjectポインタを1つの単一のロールとして返し、QMLのオブジェクトのプロパティにアクセスできます。しかし、エントリごとに複数のデータ値を持つためのQObjectベースのデータエントリは必要ありません。モデルは内部データ構造でそれを行うことができます。 –