Model/View(模型/视图)结构是Qt中用界面组件显示与编辑数据的一种结构,视图(View)是显示和编辑数据的界面组件,模型(Model)是视图与原始数据之间的接口。Model/View结构的典型应用是在数据库应用程序中,例如数据库中的一个数据表可以在一个QTableView组件中显示和编辑。
本章介绍Model/View结构编程原理,介绍了QFileSystemModel、QStringListModel、QStandardItemModel等数据模型,以及这些模型与QListView、QTreeView、QTableView等视图组件结合的使用方法。
本节介绍了Model/View结构的基本原理、一些关键概念等,点击上面的连接进入完整版内容。
5.2 QFileSystemModel 【摘要】
QFileSystemModel为本机的文件系统提供一个数据模型,可用于访问本机的文件系统。QFileSystemModel和视图组件QTreeView结合使用,可以用目录树的形式显示本机上的文件系统,如同Widnows的资源管理器一样。使用QFileSystemModel提供的接口函数,可以创建目录、删除目录、重命名目录,可以获得文件名称、目录名称、文件大小等参数,还可以获得文件的详细信息。
使用QFileSystemModel作为数据模型,使用QTreeView、QListView、QTableView为主要组件设计的实例samp5_1运行时界面如图5-6所示。在TreeView中以目录树的形式显示本机的文件系统,在TreeView上单击一个目录时,在右边的ListView和TableView显示该目录下的目录和文件。在TreeView上单击一个目录或文件节点时,在下方的几个标签里显示当前节点的信息。
图5-6实例samp5_1的运行时界面
5.3 QStringListModel
QStringListModel是用于处理字符串列表的数据模型,可以作为QListView的数据模型,在界面上显示和编辑字符串列表。
实例samp5_2采用QStringListModel作为数据模型,QListView组件作为视图组件,演示了QStringListModel和QListView构成Model/View结构编辑字符串列表的功能,程序运行时界面如图5-7所示。
图5-7 实例samp5_2的运行时界面
窗口左侧是对QStringListModel的一些操作,右侧的QPlaintextEdit组件显示QStringListModel:: stringList()的内容,以查看其内容是否与界面上ListView组件显示的内容一致。
5.4 QStandardItemModel
QStandardItemModel是标准的以项数据(item data)为基础的标准数据模型类,通常与QTableView组合成Model/View结构,实现通用的二维数据的管理功能。
还有一个类QItemSelectionModel,是一个用于跟踪视图组件的单元格选择状态的类,当在QTableView选择某个单元格,或多个单元格时,通过QItemSelectionModel可以获得选中的单元格的模型索引,为单元格的选择操作提供方便。
实例samp5_3演示QStandardItemModel、QItemSelectionModel、QTableView的使用,其运行时界面如图5-8所示。
图5-8 实例samp5_3的运行时界面
该实例具有如下的功能:
● 打开一个纯文本文件,该文件是规则的二维数据文件,通过字符串处理获取表头和各行各列的数据,导入到一个QStandardItemModel数据模型。
● 编辑修改数据模型的数据,可以插入行、添加行、删除行,可以在QTableView视图组件中直接修改单元格的数据内容。
● 可以设置数据模型中某个项的不同角色的数据,设置文字对齐方式、字体是否粗体等。
● 通过QItemSelectionModel获取视图组件上的当前单元格,以及选择单元格的范围,对选择的单元格进行操作。
● 将数据模型的数据内容显示到QPlainTextEdit组件里,显示数据模型的内容,检验视图组件上做的修改是否与数据模型同步。
● 将修改后的模型数据另存为一个文本文件。
5.5 自定义代理在前一节的实例samp5_3中,在导入数据文件进行编辑时,QTableView组件为每个单元格提供的是缺省的代理编辑组件,就是一个QLineEdit组件。在编辑框里可以输入任何数据,所以比较通用。但是有些情况下,希望根据数据的类型限定使用不同的编辑组件,例如在samp5_3的实例的数据中,第1列“测深”是整数,使用QSpinBox作为编辑组件更合适,“垂深”、“方位”、“总位移”是浮点数,使用QDoubleSpinBox更合适,而“固井质量”使用一个QComboBox,从一组列表文字中选择更合适。
要实现这些功能,就需要为TableView组件的某列或某个单元格设置自定义代理组件。本节在实例samp5_3的基础上,为TableView增加自定义代理组件功能。设定自定义代理组件之后的TableView运行时处于编辑状态时的效果如图5-11所示。
图5-11 设置自定义代理组件后的TableView编辑时的效果
自定义代理类从QStyledItemDelegate或QItemDelegate继承,自定义代理类必须实现如下的4个函数:
● createEditor()函数创建用于编辑模型数据的widget组件,如一个QSpinBox组件,或一个QComboBox组件。
● setEditorData()函数从数据模型获取数据,供widget组件进行编辑。
● setModelData()将widget上的数据更新到数据模型。
● updateEditorGeometry()用于给widget组件设置一个合适的大小。
本节通过实例程序samp5_4详细介绍了自定义代理组件的设计和使用方法。