怎么用 QAbstractItemModel 实现个tableView
时间: 2024-03-17 12:44:15 浏览: 52
可以按照以下步骤使用 QAbstractItemModel 实现一个基本的 QTableView:
1. 创建一个继承自 QAbstractItemModel 的子类,实现其中的纯虚函数 rowCount()、columnCount()、data()、setData()、flags(),分别用于返回行数、列数、单元格数据、设置单元格数据和单元格标识等操作。例如:
```cpp
class MyModel : public QAbstractItemModel
{
public:
MyModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent) const override;
int columnCount(const QModelIndex &parent) const override;
QVariant data(const QModelIndex &index, int role) const override;
bool setData(const QModelIndex &index, const QVariant &value, int role) override;
Qt::ItemFlags flags(const QModelIndex &index) const override;
private:
QVector<QVector<QString>> m_data; // 存储单元格数据的二维数组
};
```
2. 在主窗口中创建一个 QTableView 控件,然后将其设置为模式视图(setModel() 函数),并将模型数据设置为步骤1中创建的 MyModel 对象。例如:
```cpp
QTableView *tableView = new QTableView(this);
MyModel *model = new MyModel(this);
tableView->setModel(model);
```
3. 可以在 MyModel 中的 data() 函数中返回具体的单元格数据,例如:
```cpp
QVariant MyModel::data(const QModelIndex &index, int role) const
{
if (role != Qt::DisplayRole)
return QVariant();
if (index.row() >= m_data.size() || index.column() >= m_data.at(0).size())
return QVariant();
return m_data.at(index.row()).at(index.column());
}
```
4. 可以在 MyModel 中的 setData() 函数中设置具体的单元格数据,例如:
```cpp
bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (index.isValid() && role == Qt::EditRole) {
m_data[index.row()][index.column()] = value.toString();
emit dataChanged(index, index, {role});
return true;
}
return false;
}
```
5. 最后,可以在 MyModel 中的 flags() 函数中设置单元格的编辑标识,例如:
```cpp
Qt::ItemFlags MyModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::NoItemFlags;
return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
}
```
通过以上步骤,就可以使用 QAbstractItemModel 实现一个基本的 QTableView 了。需要注意的是,以上代码仅为示例,实际使用时需要根据具体需求进行修改和扩展。
阅读全文