转载Qt QStandardItemModel用法(超级详细)
Qt QStandardItemModel用法(超级详细)
QStandardItemModel 是标准的以项数据(item data)为基础的标准数据模型类,通常与 QTableView 组合成 Model/View 结构,实现通用的二维数据的管理功能。
本节介绍 QStandardltemModel 的使用,主要用到以下 3 个类:
- QStandardItemModel:基于项数据的标准数据模型,可以处理二维数据。维护一个二维的项数据数组,每个项是一个 QStandardltem 类的变量,用于存储项的数据、字体格式、对齐方式等。
- QTableView:二维数据表视图组件,有多个行和多个列,每个基本显示单元是一个单元格,通过 setModel() 函数设置一个 QStandardItemModel 类的数据模型之后,一个单元格显示 QStandardItemModel 数据模型中的一个项。
- QItemSelectionModel:一个用于跟踪视图组件的单元格选择状态的类,当在 QTableView 选择某个单元格,或多个单元格时,通过 QItemSelectionModel 可以获得选中的单元格的模型索引,为单元格的选择操作提供方便。
这几个类之间的关系是:QTableView 是界面视图组件,其关联的数据模型是 QStandardItem Model,关联的项选择模型是 QItemSelectionModel,QStandardItemModel 的数据管理的基本单元是 QStandardItem。
实例 samp5_3 演示 QStandardItemModel 的使用,其运行时界面如图 1 所示。
图 1 实例 samp5_3 的运行时界面
该实例具有如下功能:
- 打开一个纯文本文件,该文件是规则的二维数据文件,通过字符串处理获取表头和各行各列的数据,导入到一个 QStandardItemModel 数据模型。
- 编辑修改数据模型的数据,可以插入行、添加行、删除行,还可以在 QTableView 视图组件中直接修改单元格的数据内容。
- 可以设置数据模型中某个项的不同角色的数据,包括文字对齐方式、字体是否粗体等。
- 通过 QItemSelectionModel 获取视图组件上的当前单元格,以及选择单元格的范围,对选择的单元格进行操作。
- 将数据模型的数据内容显示到 QPlainTextEdit 组件里,显示数据模型的内容,检验视图组件上做的修改是否与数据模型同步。
- 将修改后的模型数据另存为一个文本文件。
界面设计与主窗口类定义
本实例的主窗口从 QMainWindow 继承而来,中间的 TableView 和 PlainTextEdit 组件采用水平分割条布局。在 Action 编辑器中创建如图 2 所示的一些 Action,并由 Action 创建主工具栏上的按钮,下方的状态栏设置了几个 QLabel 组件,显示当前文件名称、当前单元格行号、列号,以及相应内容。
图 2 实例中创建的 Action
主窗口类 MainWindow 里新增的定义如下(省略了 UI 设计器生成的界面组件的槽函数的声明):
#define FixedColumnCount 6 //文件固定 6 列
class MainWindow : public QMainWindow
{
Q_OBJECT private:
QLabel *LabCurFile; //当前文件
QLabel *LabCellPos; //当前单元格行列号
QLabel *LabCellText; //当前单元格内容
QStandardItemModel * theModel; //数据模型
QItemSelectionModel *theSelection; //选择模型
void iniModelFromStringList (QStringList&) ; //从 StringList 初始化数据模型
public:
explicit MainWindow(QWidget *parent = 0);
private slots:
//当前选择单元格发生变化
void on_currentChanged(const QModelIndex ¤t, const QModelIndex &previous);
private:
Ui::MainWindow *ui;
};
这里定义了数据模型变量 theModel,项数据选择模型变量 theSelection。
定义的私有函数 iniModelFromStringList() 用于在打开文件时,从一个 QStringList 变量的内容创建数据模型。