Qt 提供了一套强大的模型/视图框架,允许你以一种非常灵活和高效的方式显示和处理数据。在 Qt 中,表格视图(TableView)和模型(TableModel)是这种框架的一部分,常用于显示和编辑表格数据。
以下是一些基本的概念和步骤,帮助你理解如何在 Qt 中使用表格模型和视图:
-
模型(Model)
模型是数据的抽象表示。在 Qt 中,模型负责存储数据,并提供一种方式来访问这些数据。QAbstractTableModel 是一个常用的基类,用于创建自定义的表格模型。 -
视图(View)
视图是模型的可视化表示。QTableView 是一个表格视图,显示模型中的数据,并允许用户与数据进行交互。 -
代理(Delegate)
代理用于自定义视图中的单元格的显示和编辑方式。QStyledItemDelegate 或自定义的 QItemDelegate 可以用于此目的。 -
编辑器(Editor)
编辑器是用于编辑单元格的组件。例如,QLineEdit 可以用于编辑文本。 -
选择模型(Selection Model)
选择模型用于管理用户在视图中的选择。
#include "mytablemodel.h"
#include <QtMath>
#include <QColor>MyTableModel::MyTableModel(QObject *parent) : QAbstractTableModel(parent)
{m_columnNum=9;
}void MyTableModel::setInitData(QList<CellInfo*>& data)
{//重置model数据之前调用beginResetModel,此时会触发modelAboutToBeReset信号beginResetModel();//重置model中的数据m_datas = data;m_rowNum = ceil(data.size()*1.0/m_columnNum); //行数=数据总数/列数,然后向上取整//数据设置结束后调用endResetModel,此时会触发modelReset信号endResetModel();
}int MyTableModel::rowCount(const QModelIndex &parent) const
{if (parent.isValid()) {return 0;} else {return m_rowNum;}
}int MyTableModel::columnCount(const QModelIndex &parent) const
{if (parent.isValid()) {return 0;} else {return m_columnNum;}
}QVariant MyTableModel::data(const QModelIndex &index, int role) const
{if (!index.isValid()) {return QVariant();}if(index.row()*m_columnNum+index.column() < m_datas.count()){if (role == Qt::DisplayRole || role == Qt::EditRole) {return m_datas[index.row()*m_columnNum+index.column()]->content;//数据的呈现形式}else if(role == Qt::BackgroundColorRole){return m_datas[index.row()*m_columnNum+index.column()]->bgColor;//单元格背景色}else if (role == Qt::TextAlignmentRole) { //对其方式return Qt::AlignCenter;}else if(role == Qt::ToolTipRole){return m_datas[index.row()*m_columnNum+index.column()]->toolTip;//数据的提示信息}else if(role == Qt::UserRole){return QVariant::fromValue(m_datas[index.row()*m_columnNum+index.column()]);}}return QVariant();
}Qt::ItemFlags MyTableModel::flags(const QModelIndex &index) const
{if (!index.isValid())return Qt::NoItemFlags;return Qt::ItemIsEnabled|Qt::ItemIsSelectable|Qt::ItemIsEditable;
}bool MyTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{if(index.row()*m_columnNum+index.column() < m_datas.count()){if (index.isValid() && role == Qt::EditRole){m_datas[index.row()*m_columnNum+index.column()]->content = value.value<QString>();emit dataChanged(index, index, QVector<int>() << role); //发送信号触发刷新return true;}if (index.isValid() && role == Qt::BackgroundColorRole){m_datas[index.row()*m_columnNum+index.column()]->bgColor = value.value<QColor>();emit dataChanged(index, index, QVector<int>() << role); //发送信号触发刷新return true;}}return false;
}