发布时间:2026/8/13 16:49:10
界面开发框架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/8/13 16:49:10

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

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

2026/8/13 16:44:10

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

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

2026/8/13 16:44:10

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/8/13 17:44:18

PDF补丁丁:你的免费PDF工具箱,解决90%的PDF编辑难题

PDF补丁丁:你的免费PDF工具箱,解决90%的PDF编辑难题 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等 项目地址: h…

2026/8/13 17:44:18

Hap QuickTime Codec:专业视频编码的硬件加速解决方案

Hap QuickTime Codec:专业视频编码的硬件加速解决方案 【免费下载链接】hap-qt-codec A QuickTime codec for Hap video 项目地址: https://gitcode.com/gh_mirrors/ha/hap-qt-codec 当专业视频编辑师面临实时播放高分辨率视频的挑战时,硬件加速解…

2026/8/13 17:44:17

335款车型兼容!openpilot开源智能驾驶系统完全指南

335款车型兼容!openpilot开源智能驾驶系统完全指南 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.com/GitHub_Trending/o…

2026/8/12 10:37:12

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 5:35:25

当 LLM 遇见大文档:主流开源项目如何处理上下文超限

从 Agentic Loop 到 Repo Map,七种策略与六类陷阱引言:128K vs 10MB 的硬冲突 2026 年的 LLM 上下文窗口已达到 128K ~ 1M token(≈ 0.5MB ~ 4MB 文本),但 LLM 想要处理的真实数据规模远远超过这个量级:真实…

2026/8/13 0:02:21

Prefix Cache

Prefix Cache(前缀缓存) 是大模型推理引擎(如 vLLM、SGLang、TensorRT-LLM)中用于跨请求复用已计算 KV Cache 的核心内存与计算优化技术。 它的核心目的在于:彻底消除重复 Prompt 的 Prefill 阶段计算,将首…

2026/8/13 0:02:21

VSCode插件精选:从AI补全到代码规范,打造高效开发环境

1. 项目概述:为什么说插件是VSCode的灵魂?如果你和我一样,每天有超过8小时的时间是在VSCode里度过的,那你肯定明白,一个顺手的开发环境有多重要。VSCode本身已经足够优秀了,但真正让它从“好用的编辑器”蜕…

2026/8/13 0:02:21

如何快速完成文件批量重命名:FreeReNamer终极指南

如何快速完成文件批量重命名:FreeReNamer终极指南 【免费下载链接】FreeReNamer 功能强大又易用的文件批量重命名软件 项目地址: https://gitcode.com/gh_mirrors/fr/FreeReNamer 你是否曾经面对成百上千个杂乱无章的文件感到头疼?传统的手动重命…

2026/8/10 11:20:30

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/11 17:06:59

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/11 3:05:11

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…