热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

表格是用户界面中最常用的控件,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中的内容。

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


推荐阅读
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • WPF开发心率检测大数据曲线图的高性能实现方法
    本文介绍了在WPF开发中实现心率检测大数据曲线图的高性能方法。作者尝试过使用Canvas和第三方开源库,但性能和功能都不理想。最终作者选择使用DrawingVisual对象,并结合局部显示的方式实现了自己想要的效果。文章详细介绍了实现思路和具体代码,对于不熟悉DrawingVisual的读者可以去微软官网了解更多细节。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
author-avatar
大伙没事偷着乐吧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有