我正在做一个简单的项目来尝试学习 QT 5.7、QML 和 C++。我想创建一个简单的界面,其中包含一个项目列表,我可以使用几个按钮添加和删除项目。我一直在在线阅读一堆不同的指南,试图拼凑一些东西,但我一直卡住。我试过使用QQmlListProperty<T>
,QAbstractListModel
但我对这两种方法都有疑问:
- 对于我的项目是
QQmlListProperty<T>
正确的使用还是我应该使用QAbstractListModel
? - 无论哪种情况,我如何通知我的 QML 视图列表已更改?
- 如果我使用“QAbstractListModel”,我是否只需要创建
Q_INVOKABLE
用于在列表中添加和删除项目的方法?
以下是我迄今为止QQmlListProperty<T>
的代码。QAbstractListModel
我省略了大部分类的实现以保持这篇文章的简短,但如果需要实现,我很乐意添加它。
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
列表类
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;
};
实施getItms()
:
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;
};