Qt模型/视图架构:从只读到可编辑模型的实现

1. 创建只读模型

在Qt框架中,模型/视图架构是处理数据显示和编辑的核心机制。创建一个只读模型是理解这个架构的基础步骤。让我们从零开始构建一个简单的只读模型。

1.1 继承QAbstractItemModel

所有自定义模型都应该继承自QAbstractItemModel或其子类。对于简单的表格数据,我们可以选择继承QAbstractTableModel:

cpp复制class SimpleTableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    explicit SimpleTableModel(QObject *parent = nullptr);
    
    // 必须重写的纯虚函数
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
    
private:
    QVector<QVector<QString>> m_data;  // 二维数组存储表格数据
};

提示:QAbstractTableModel已经默认实现了index()和parent()方法,适合表格数据的展示。如果是树形数据,则需要继承QAbstractItemModel并自行实现这些方法。

1.2 实现基础功能

让我们实现这个简单模型的核心方法:

cpp复制SimpleTableModel::SimpleTableModel(QObject *parent) 
    : QAbstractTableModel(parent)
{
    // 初始化测试数据
    m_data = {
        {"张三", "25", "工程师"},
        {"李四", "30", "设计师"},
        {"王五", "28", "产品经理"}
    };
}

int SimpleTableModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return m_data.size();
}

int SimpleTableModel::columnCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return m_data.isEmpty() ? 0 : m_data.first().size();
}

QVariant SimpleTableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid() || 

内容推荐

已经到底了哦
已经到底了哦