基于QSortFilterProxyModel实现表格数据查询排序框架

表格是用户界面中最常用的控件,Qt的QTableView采用Model-View模式实现了强大的表格数据展现功能,视图与模型分离,且性能表现非常不错,几百万的数据展现轻松搞定。

但QTableView没有提供数据排序与查询的功能,需要借助于QSortFilterProxyModel这个代理模型,对于一个多窗体的应用程序,每个窗体下的表格控件单独排序是没有问题的,但要实现数据查询与过滤,基于QSortFilterProxyModel需要设置被查询的列及要查询的字符串,如果每个窗体都单独实现,需要每个窗体内都增加一个ListBox及TextBox,分别进行列的设置及要查询的字符串的输入,需要编写重复代码且界面不美观,本文给出的表格数据查询排序框架设计通过工具栏的方式实现列的选择与查询字符串的输入,各子窗体通过与该工具栏的动态绑定实现数据查询的功能。架构设计如下图所示。
类关系图

MainWindow是主窗体类,包含了多个SubWindow子窗体,通过switchWindow接口实现不同子窗体间的切换显示,MainWindow还包含了一个工具栏QueryToolBar,实现查询列及查询字符串的输入,包括TitleListBox与QueryTextBox两个控件,QuyerToolBar实现了TitleUpdater接口,该接口用于更新可用于查询的列的集合,即TitleListBox中的项。

每个需要进行表格数据查询的子窗体都包含一个SortFilterTableView对象,该对象继承自QTableView,同时还继承自TableDataFilter接口,该接口包含两个接口函数,一个filterData,用于输入查询的列及查询字符串,一个setTitleUpdate,用于设置TitleUpdate接口。

在主窗体进行子窗体切换以激活某个子窗体时,子窗体通过接口getTableDataFilter将表格数据过滤器对象动态传递给QueryToolBar,当QueryToolBar中的两个控件内容发生变化时,通过接口函数filterData将查询信息传递给SortFilterTableView,实现数据查询过滤的功能。

在子窗体通过接口getTableDataFilter将表格数据过滤器对象动态传递给QueryToolBar时,QueryToolBar会通过tableDataFilter的接口函数setTitleUpdater将TitleListBox传递给SortFilterTableView,当表格总的列名或列的个数发生变化时,通过接口TitleUpdater更新TitleListBox中的内容。

以上框架的实现,符合面向对象设计原则,面向接口编程,职责单一,易于扩展。

猜你喜欢

转载自blog.csdn.net/yanzel/article/details/50933796