Qt中Model与List的使用

本文介绍Qt编程中,Model作为QAbstractItemModel的子类,与List(QMediaPlaylist)的结合使用。Model不直接存储数据,而是通过内部的List成员和值对表QMap来管理和提供数据访问。当使用Model时,需先设置List,然后通过Model提供的接口(如rowCount、columnCount、index、parent、data和setData等)来操作和获取数据。此外,还讨论了Model在数据变更时需调用的保护函数,如beginResetModel、endResetModel、beginInsertRows、endInsertRows和beginRemoveRows、endRemoveRows。

class PlaylistModel : public QAbstractItemModel
{
  
  
    Q_OBJECT
 
public:
    enum Column
    {
  
  
        Title = 0,
        ColumnCount
    };
 
    PlaylistModel(QObject *parent = 0);
 
    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    int columnCount(const QModelIndex &parent = QModelIndex()) const;
 
    QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
    QModelIndex parent(const QModelIndex &child) const;
 
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
 
    QMediaPlaylist *playlist() const;
    void setPlaylist(QMediaPlaylist *playlist);
 
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::DisplayRole);
 

                
<think>我们正在讨论QtModel使用方法。用户希望了解常见用法和示例代码。根据引用内容,我们可以从以下几个方面展开:1.Qt提供的标准Model(如QStandardItemModel和QDirModel)的使用。2.如何使Model可编辑(通过重写flags()和setData()函数)。3.自定义Model的实现方式(例如引用[4]中提到的,Model不直接存储数据,而是使用一个外部数据结构)。由于用户要求包括常见用法和示例代码,我们将按照以下结构回答:-介绍QtModel/View架构的基本概念。-使用标准Model(QStandardItemModel)的示例。-使用QDirModel(或QFileSystemModel)的示例。-如何使Model可编辑(重写flags和setData)。-自定义Model的实现示例(以简单的ListModel为例)。注意:引用[1]提到了QSqlTableModel,但用户问题中没有特别提到数据库,所以我们主要围绕通用Model展开。如果用户后续询问数据库相关,再深入。另外,引用[2]和[3]提供了关于标准Model和可编辑Model的重要信息,引用[4]则给出了自定义Model的一种实现方式(使用外部数据结构存储数据)。下面开始组织回答。</think>### QtModel使用方法及实现 #### 1. **Qt Model/View架构基础** Qt采用Model/View架构实现数据显示的分离: - **Model**:管理数据(如`QAbstractItemModel`子类) - **View**:显示数据(如`QListView`、`QTableView`) - **Delegate**:控制数据渲染和编辑 引用[2]指出:Qt提供`QStandardItemModel`(通用数据结构)和`QDirModel`(文件系统描述)等标准Model[^2]。 #### 2. **标准Model使用示例** **QStandardItemModel示例(表格数据)**: ```cpp // 创建Model和View QStandardItemModel *model = new QStandardItemModel(3, 2); // 3行2列 QTableView *view = new QTableView; // 填充数据 model->setItem(0, 0, new QStandardItem("姓名")); model->setItem(0, 1, new QStandardItem("年龄")); model->setItem(1, 0, new QStandardItem("张三")); model->setItem(1, 1, new QStandardItem("25")); // 关联View view->setModel(model); ``` 此Model可直接用于`QListView`/`QTableView`/`QTreeView`。 **QFileSystemModel示例(文件浏览)**: ```cpp QFileSystemModel *model = new QFileSystemModel; model->setRootPath(QDir::homePath()); QTreeView *view = new QTreeView; view->setModel(model); view->setRootIndex(model->index(QDir::homePath())); ``` #### 3. **自定义可编辑Model** 要使Model可编辑,需重写三个关键函数(引用[3])[^3]: ```cpp class CustomModel : public QAbstractListModel { public: // 1. 返回数据 QVariant data(const QModelIndex &index, int role) const override { if (role == Qt::DisplayRole) return m_data[index.row()]; } // 2. 设置编辑标志 Qt::ItemFlags flags(const QModelIndex &index) const override { return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; } // 3. 处理数据修改 bool setData(const QModelIndex &index, const QVariant &value, int role) override { if (role == Qt::EditRole) { m_data[index.row()] = value.toString(); emit dataChanged(index, index); // 通知视图更新 return true; } return false; } private: QStringList m_data = {"Item1", "Item2"}; // 数据存储 }; ``` #### 4. **Model外部数据关联** 引用[4]展示了Model外部数据结构的协作方式[^4]: ```cpp class PlaylistModel : public QAbstractItemModel { public: PlaylistModel(QMediaPlaylist *playlist, QObject *parent = nullptr) : QAbstractItemModel(parent), m_playlist(playlist) {} // 通过index获取外部数据 QVariant data(const QModelIndex &index, int role) const override { if (role == Qt::DisplayRole) return m_playlist->media(index.row()).title(); } private: QMediaPlaylist *m_playlist; // 外部数据源 }; ``` #### 5. **数据库Model(引用[1])** `QSqlTableModel`提供数据库表的高级接口[^1]: ```cpp QSqlTableModel *model = new QSqlTableModel; model->setTable("employees"); model->setEditStrategy(QSqlTableModel::OnManualSubmit); model->select(); QTableView *view = new QTableView; view->setModel(model); view->setEditTriggers(QAbstractItemView::DoubleClicked); // 启用编辑 ``` ### 关键实践建议 1. **性能优化**: - 大数据集使用`QAbstractItemModel`的懒加载 - 批量修改时调用`beginResetModel()/endResetModel()` 2. **信号机制**: - 数据变更时触发`dataChanged()`信号 - 结构变化时触发`layoutChanged()` 3. **委托定制**: - 通过`QStyledItemDelegate`自定义单元格渲染 > 示例完整项目参考:[Qt Model/View Tutorial](https://doc.qt.io/qt-6/model-view-programming.html)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值