TableView、QStandardItemModel、QItemSelectionModel使用总结

QStandardItemModel 是标准的以QStandardItem为基础的标准数据模型类,通常与 QTableView 组合成 Model/View 结构,实现通用的二维数据的管理功能。

这几个类之间的关系是:QTableView 是界面视图组件,其关联的数据模型是 QStandardItem Model,关联的项选择模型是 QItemSelectionModel,QStandardItemModel 的数据管理的基本单元是 QStandardItem。

本节介绍 QStandardltemModel 的使用,主要用到以下 3 个类:

1、QTableView:

二维数据表视图组件,有多个行和多个列,每个基本显示单元是一个单元格,通过 setModel() 函数设置一个 QStandardItemModel 类的数据模型之后,一个单元格显示 QStandardItemModel 数据模型中的一个项。

除了常用的设置、查询行高、列宽、行表头、列表头之外,还有下列方法也常用到。

void setCornerButtonEnabled(bool enable) 设置表格左上角是否设置勾选框,用于全选所有的单元格
void setSortingEnabled(bool enable) 设置是否支持排序
void setSpan(int row, int column, int rowSpanCount, int columnSpanCount) 设置单元格合并
virtual void setModel(QAbstractItemModel *model) override 设置数据模型
virtual void setSelectionModel(QItemSelectionModel *selectionModel) override 设置选择模型
void selectRow(int row) 选择行
void showColumn(int column) 选择列
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior) 设置选择时的行为
void setSelectionMode(QAbstractItemView::SelectionMode mode) 设置选择模式

2、QStandardItemModel

继承自QAbstractItemModel,基于项数据的标准数据模型,可以处理二维数据。维护一个二维的项数据数组,每个项是一个 QStandardltem 类的变量,用于存储项的数据、字体格式、对齐方式等。

除了常用的插入行、列、单元格外,常用方法如下。

void clear() 清除模型中数据项
bool clearItemData(const QModelIndex &index) 清除QModelIndex中的数据项
QList<QStandardItem *> findItems(const QString &text, Qt::MatchFlags flags = Qt::MatchExactly, int column = 0) const 根据指定的column,指定的text,用指定的flags来查询出匹配的项(QStandardItem)。指定的flags默认为相等,可以进行正则匹配。
QStandardItem * horizontalHeaderItem(int column) const 指定列的行表头项
QModelIndex indexFromItem(const QStandardItem *item) const 查询指定QStandardItem的QModelIndex
QStandardItem * itemFromIndex(const QModelIndex &index) const 查询指定QModelIndex的QStandardItem
void setColumnCount(int columns) 设置列数量,超出设置的列会丢弃。
void setHorizontalHeaderItem(int column, QStandardItem *item) 设置指定列的行表头
void setHorizontalHeaderLabels(const QStringList &labels) 设置水平表头
void setRowCount(int rows) 设置行数量,超出设置的行会丢弃。
void setVerticalHeaderItem(int row, QStandardItem *item) 设置指定行的列表头
void setVerticalHeaderLabels(const QStringList &labels) 设置列表头
QStandardItem * verticalHeaderItem(int row) const 查询指定row的列表头

QStandardltem 常用属性如下:

void appendColumn(const QList<QStandardItem *> &items) 纵向添加QStandardItem
void appendRow(const QList<QStandardItem *> &items) 横向添加QStandardItem
int column() const 单元格所在列
QModelIndex index() const 单元格索引
QStandardItemModel * model() const 单元格所属QStandardItemModel
int row() const 单元格所在行
void setAutoTristate(bool tristate) 设置是否自动三态选择,全选、不选、部分选择
void setBackground(const QBrush &brush) 设置背景
void setCheckState(Qt::CheckState state) 设置选择状态
void setCheckable(bool checkable) 设置是否可勾选
void setDragEnabled(bool dragEnabled) 设置是否可拖拽
void setDropEnabled(bool dropEnabled) 设置是否可接收拖入
void setEditable(bool editable) 设置是否可编辑
void setEnabled(bool enabled) 设置是否有效,只有有效情况下才能进行其他交互,比如选择、编辑等
void setFont(const QFont &font) 设置字体
void setForeground(const QBrush &brush) 设置前景
void setIcon(const QIcon &icon) 设置ICON
void setSelectable(bool selectable) 设置是否可选择
void setText(const QString &text) 设置单元格文本
void setTextAlignment(Qt::Alignment alignment) 设置单元格文本对齐方式
void setUserTristate(bool tristate) 设置是否支持三态选择,全选、不选、部分选择
void setFlags(Qt::ItemFlags flags) 设置单元格标志,可选标志如下:

QModelIndex用于定义QStandardItemModel中QStandardltem的索引

int column() const 模型索引所在的列
QVariant data(int role = Qt::DisplayRole) const 索引的指定role值,默认为DisplayRole
Qt::ItemFlags flags() const 索引指向单元格的标志
bool isValid() const 索引是否有效
const QAbstractItemModel * model() const 该索引所属的QAbstractItemModel模型
int row() const 模型索引所在的行
QModelIndex sibling(int row, int column) const 指定行列的兄弟索引
QModelIndex siblingAtColumn(int column) const 当前行的列兄弟索引
QModelIndex siblingAtRow(int row) const 当前列的行兄弟索引

3、QItemSelectionModel

一个用于跟踪视图组件的单元格选择状态的类,当在 QTableView 选择某个单元格,或多个单元格时,通过 QItemSelectionModel 可以获得选中的单元格的模型索引,为单元格的选择操作提供方便。

QModelIndex currentIndex() const 当前单元格的QModelIndex索引,当前单元格是键盘可以操作和获取鼠标焦点的单元格
bool hasSelection() const 是否有单元被选择
bool isColumnSelected(int column, const QModelIndex &parent) const 指定列是否全部被选择
bool isRowSelected(int row, const QModelIndex &parent) const 指定行是否全部被选择
bool isSelected(const QModelIndex &index) const QModelIndex指定的单元格是否被选中
const QAbstractItemModel * model() const 选择列表模型跟踪的QAbstractItemModel 
QAbstractItemModel * model() 选择列表模型跟踪的QAbstractItemModel 
QModelIndexList selectedColumns(int row = 0) const 指定行选择的列列表,默认第0行
QModelIndexList selectedIndexes() const 选择的索引列表
QModelIndexList selectedRows(int column = 0) const 指定列选择的行列表,默认第0列
const QItemSelection selection() const 选择列表模型存储的选择范围QItemSelection
void setModel(QAbstractItemModel *model) 设置选择列表模型跟踪的QAbstractItemModel
virtual void select(const QItemSelection &selection, QItemSelectionModel::SelectionFlags command) 根据command选择指定的QItemSelection,command如下:
virtual void select(const QModelIndex &index, QItemSelectionModel::SelectionFlags command) 根据command选择指定的QModelIndex,command如下:

QItemSelection类管理选择单元格的范围信息

bool contains(const QModelIndex &index) const 判断选择范围是否包含QModelIndex指定的单元格
QModelIndexList indexes() const 选择范围的QModelIndex单元格列表
void merge(const QItemSelection &other, QItemSelectionModel::SelectionFlags command) 合并指定QItemSelection的选择范围方式,只支持ItemSelectionModel::Select, QItemSelectionModel::Deselect,QItemSelectionModel::Toggle
void select(const QModelIndex &topLeft, const QModelIndex &bottomRight) 选择从topLeft到bottomRight指定的单元格

猜你喜欢

转载自blog.csdn.net/bluewhu/article/details/104917179