界面开发框架Qt新手入门 - 自定义排序/筛选模型示例(二)

发布时间:2026/9/30 20:16:04

界面开发框架Qt新手入门 - 自定义排序/筛选模型示例(二) Qt是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写所有平台无差别运行更提供了几乎所有开发过程中需要用到的工具。如今Qt已被运用于超过70个行业、数千家企业支持数百万设备及应用。自定义排序/筛选模型示例说明了如何子类化QSortFilterProxyModel来执行高级排序和筛选。在上文中为大家讲解了如何实现MySortFilterProxyModel类、MySortFilterProxyModel的定义本文将继续讲解Window类的定义和实现Window类定义CustomFilter类继承了QWidget并提供了这个例子的主应用程序窗口class Window : public QWidget { Q_OBJECT public: Window(); void setSourceModel(QAbstractItemModel *model); private slots: void textFilterChanged(); void dateFilterChanged(); private: MySortFilterProxyModel *proxyModel; QGroupBox *sourceGroupBox; QGroupBox *proxyGroupBox; QTreeView *sourceView; QTreeView *proxyView; QLabel *filterPatternLabel; QLabel *fromLabel; QLabel *toLabel; FilterWidget *filterWidget; QDateEdit *fromDateEdit; QDateEdit *toDateEdit; };我们实现了两个私有槽textFilterChanged()和dateFilterChanged()用于响应用户更改过滤器模式、区分大小写或任何日期此外还实现了一个公共的setSourceModel()方便函数来设置模型/视图关系。Window类实现在本示例中我们选择在main()函数中创建和设置源模型因此在构建主应用程序窗口时假设源模型已经存在并从创建自定义代理模型的实例开始Window::Window() { proxyModel new MySortFilterProxyModel(this);我们设置dynamicSortFilter属性该属性保存代理模型是否被动态排序和过滤。通过将该属性设置为true可以确保在源模型的内容发生变化时对模型进行排序和过滤。主应用程序窗口显示源模型和代理模型的视图源视图非常简单sourceView new QTreeView; sourceView-setRootIsDecorated(false); sourceView-setAlternatingRowColors(true);QTreeView类提供了树视图的默认模型/视图实现视图实现了应用程序源模型中项目的树表示。sourceLayout-addWidget(sourceView); sourceGroupBox new QGroupBox(tr(Original Model)); sourceGroupBox-setLayout(sourceLayout);QTreeView 类提供了树视图的默认模型/视图实现视图实现了应用程序源模型中项目的树表示将视图小部件添加到我们安装在相应组框上的布局中。另一方面代理模型视图包含几个控件这些控件控制转换源模型数据结构的各个方面filterWidget new FilterWidget; filterWidget-setText(tr(Grace|Sports)); connect(filterWidget, FilterWidget::filterChanged, this, Window::textFilterChanged); filterPatternLabel new QLabel(tr(Filter pattern:)); filterPatternLabel-setBuddy(filterWidget); fromDateEdit new QDateEdit; fromDateEdit-setDate(QDate(1970, 01, 01)); fromLabel new QLabel(tr(From:)); fromLabel-setBuddy(fromDateEdit); toDateEdit new QDateEdit; toDateEdit-setDate(QDate(2099, 12, 31)); toLabel new QLabel(tr(To:)); toLabel-setBuddy(toDateEdit); connect(filterWidget, QLineEdit::textChanged, this, Window::textFilterChanged); connect(fromDateEdit, QDateTimeEdit::dateChanged, this, Window::dateFilterChanged); connect(toDateEdit, QDateTimeEdit::dateChanged, this, Window::dateFilterChanged);请注意每当用户更改其中一个过滤选项时我们必须显式地重新应用该过滤器这是通过将各种编辑器连接到更新代理模型的函数来完成的。proxyView new QTreeView; proxyView-setRootIsDecorated(false); proxyView-setAlternatingRowColors(true); proxyView-setModel(proxyModel); proxyView-setSortingEnabled(true); proxyView-sortByColumn(1, Qt::AscendingOrder); QGridLayout *proxyLayout new QGridLayout; proxyLayout-addWidget(proxyView, 0, 0, 1, 3); proxyLayout-addWidget(filterPatternLabel, 1, 0); proxyLayout-addWidget(filterWidget, 1, 1); proxyLayout-addWidget(fromLabel, 3, 0); proxyLayout-addWidget(fromDateEdit, 3, 1, 1, 2); proxyLayout-addWidget(toLabel, 4, 0); proxyLayout-addWidget(toDateEdit, 4, 1, 1, 2); proxyGroupBox new QGroupBox(tr(Sorted/Filtered Model)); proxyGroupBox-setLayout(proxyLayout);排序将由视图处理我们所要做的就是通过设置QTreeView::sortingEnabled属性(默认为false)来启用代理视图的排序。然后我们将所有过滤小部件和代理视图添加到安装在相应组框上的布局中。QVBoxLayout *mainLayout new QVBoxLayout; mainLayout-addWidget(sourceGroupBox); mainLayout-addWidget(proxyGroupBox); setLayout(mainLayout); setWindowTitle(tr(Custom Sort/Filter Model)); resize(500, 450); }最后在将两个组框放入安装在主应用程序小部件上的另一个布局中之后自定义应用程序窗口。如上所述在main()函数中创建源模型调用Window::setSourceModel()函数使应用程序使用它void Window::setSourceModel(QAbstractItemModel *model) { proxyModel-setSourceModel(model); sourceView-setModel(model); for (int i 0; i proxyModel-columnCount(); i) proxyView-resizeColumnToContents(i); for (int i 0; i model-columnCount(); i) sourceView-resizeColumnToContents(i); }QSortFilterProxyModel::setSourceModel()函数使代理模型处理给定模型中的数据在本例中是邮件模型,视图小部件从QAbstractItemModel 类继承的setModel() 为视图设置要呈现的模型。注意后一个函数还将创建和设置一个新的选择模型。void Window::textFilterChanged() { FilterWidget::PatternSyntax s filterWidget-patternSyntax(); QString pattern filterWidget-text(); switch (s) { case FilterWidget::Wildcard: pattern QRegularExpression::wildcardToRegularExpression(pattern); break; case FilterWidget::FixedString: pattern QRegularExpression::escape(pattern); break; default: break; } QRegularExpression::PatternOptions options QRegularExpression::NoPatternOption; if (filterWidget-caseSensitivity() Qt::CaseInsensitive) options | QRegularExpression::CaseInsensitiveOption; QRegularExpression regularExpression(pattern, options); proxyModel-setFilterRegularExpression(regularExpression); }每当用户更改过滤器模式或区分大小写时就调用textFilterChanged()函数。首先检索首选语法(FilterWidget::PatternSyntax enum用于解释给定模式的含义)然后确定首选的大小写敏感性。基于这些参数和当前的过滤器模式我们设置代理模型的filterRegularExpression 属性。filterRegularExpression 属性保存用于过滤源模型内容的正则表达式注意调用QSortFilterProxyModel的setfilterregulareexpression()函数也会更新模型。void Window::dateFilterChanged() { proxyModel-setFilterMinimumDate(fromDateEdit-date()); proxyModel-setFilterMaximumDate(toDateEdit-date()); }每当用户修改有效日期范围时就调用dateFilterChanged()函数从用户界面检索新的日期并调用相应的函数(由自定义代理模型提供)来设置代理模型的最小和最大日期。如上所述调用这些函数也会更新模型。Main()函数在本例中我们通过在main()函数中创建模型将应用程序与源模型分离开来。首先我们创建应用程序然后创建源模型int main(int argc, char *argv[]) { QApplication app(argc, argv); Window window; window.setSourceModel(createMailModel(window)); window.show(); return app.exec(); }createMailModel()函数是为简化构造函数而提供的方便函数它所做的就是创建并返回一个描述电子邮件集合的模型。该模型是QStandardItemModel类的一个实例也就是说一个用于存储自定义数据的通用模型通常用作标准Qt数据类型的存储库每个邮件描述都使用addMail()(另一个方便的函数)添加到模型中。
延伸阅读

更多相关文章

2026/9/29 23:56:21

终极指南:如何快速配置微信QQTIM防撤回补丁

终极指南:如何快速配置微信QQTIM防撤回补丁 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.com/GitHub_T…

2026/9/28 19:51:10

如何永久保存微信聊天记录?完全免费的WeChatMsg工具终极指南

如何永久保存微信聊天记录?完全免费的WeChatMsg工具终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we…

2026/9/29 6:46:40

5分钟网页变应用:PakePlus零代码桌面应用打包终极指南

5分钟网页变应用:PakePlus零代码桌面应用打包终极指南 【免费下载链接】PakePlus Turn any webpage/HTML/Vue/React and so on into desktop and mobile app under 5M with easy in few minutes. 轻松将任意网站/HTML/Vue/React等项目构建为轻量级(小于5M)多端桌面应…

2026/9/30 20:15:29

选型纠结与架构落地

我花了两周把客户旧系统的定时轮询改成了WebSocket长连接,光部署就踩了三个大坑。最近帮一个做供应链监控的客户做系统升级。他们之前用Spring Boot 定时任务,每10秒拉一次数据库里的订单状态变更。业务量小的时候还行,上个月并发涨到5000&a…

2026/9/30 20:15:29

【动态slam】C++使用yolo模型核心代码学习

在动态SLAM中,只需要调用yolo训练好的模型就可以实现动态目标检测。本文用于总结使用yolo模型的基本逻辑。 (1)加载yolo模型 (2)获取模型输出 (3)后处理 (4)提取检测…

2026/9/30 20:10:28

AI绘画提示词案例去哪找

AI绘画提示词案例去哪找 找 AI 绘画提示词,最怕只看到一句「赛博朋克」却没有整段提示词,也没有效果图。案例这一层我去 Gen Feeds(https://genfeeds.com/)的 Prompt 灵感库,地址是 https://genfeeds.com/prompts 。每…

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 0:01:22

MATLAB+Yalmip+CPLEX实战:综合能源系统优化调度全流程解析

做综合能源系统优化调度这活儿,最痛苦的不是建模本身,而是模型写完之后不知道该怎么求解。看论文里轻飘飘一句“采用Yalmip调用CPLEX求解”,自己上手时却往往卡在环境配置、变量声明、约束写法和求解状态判读上,一耗就是两三天。这…

2026/9/30 0:01:22

I3C比I2C快10倍?RK3576实战:速率、DTS配置与混合总线避坑指南

I3C 比 I2C 快 10 倍?这句话在嵌入式群里传了很久,每次都能吵出一堆截图。前段时间我正好在 RK3576 上调板级 I3C 接口,从控制器寄存器一路摸到 Linux DTS 配置,踩了不少坑,也把这笔速度账彻底算明白了。本文就用 RK35…

2026/9/30 0:01:22

字符串转对象:JSON.parse、new Function与URLSearchParams

“字符串转对象”这几个字,我在技术群里见过的问法至少有十几种:有人拿着一串{a:1,b:2}说 JSON.parse 直接报错,有人要从 URL 里抠出参数,还有人只是想把abc变成能挂属性的东西。js 这门语言里,字符串和对象之间的转换…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/30 18:00:04

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/30 10:28:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑