「Qt Widget中文示例指南」如何实现一个日历?(三)
Qt是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写所有平台无差别运行更提供了几乎所有开发过程中需要用到的工具。如今Qt已被运用于超过70个行业、数千家企业支持数百万设备及应用。本文中的CalendarWidget示例展示了QCalendarWidget的用法。在上文中我们主要介绍了Window类定义的实现本节就继续介绍请继续关注我们哟~QCalendarWidget一次显示一个日历月并允许用户选择一个日期。日历由四个组件组成一个允许用户更改显示月份的导航栏、一个网格、其中每个单元格表示一个月中的一天以及两个显示星期名称和星期数字的标题。Window类实现接上文我们将复选框和组合框连接到各种私有插槽蓝色复选框中的第一个星期五和红色复选框中的May 1都连接到reformatCalendarPage()该方法在日历切换月份时也被调用。... reformatHeaders(); reformatCalendarPage(); }在createTextFormatsGroupBox()的末尾我们调用私有槽来同步QCalendarWidget与其他小部件。现在我们已经检查了四个create…GroupBox()函数现在看一下其他私有函数和槽。QComboBox *Window::createColorComboBox() { QComboBox *comboBox new QComboBox; comboBox-addItem(tr(Red), QColor(Qt::red)); comboBox-addItem(tr(Blue), QColor(Qt::blue)); comboBox-addItem(tr(Black), QColor(Qt::black)); comboBox-addItem(tr(Magenta), QColor(Qt::magenta)); return comboBox; }在createColorCombo()中我们创建了一个组合框并用标准颜色填充它。QComboBox::addItem()的第二个参数是一个存储用户数据的QVariant(在本例中是QColor对象)。此函数用于设置工作日颜色和周末颜色组合框。void Window::firstDayChanged(int index) { calendar-setFirstDayOfWeek(Qt::DayOfWeek( firstDayCombo-itemData(index).toInt())); }当用户更改组合框的值上的星期开始时firstDayChanged()将使用组合框新值的索引调用。我们使用itemData()检索与新的当前项关联的自定义数据项并将其转换为Qt::DayOfWeek。selectionModeChanged()、horizontalHeaderChanged()和verticalHeaderChanged()与firstDayChanged()非常相似因此省略它们。void Window::selectedDateChanged() { currentDateEdit-setDate(calendar-selectedDate()); }selectedDateChanged()更新Current Date编辑器以反映QCalendarWidget的当前状态。void Window::minimumDateChanged(QDate date) { calendar-setMinimumDate(date); maximumDateEdit-setDate(calendar-maximumDate()); }当用户更改最小日期时我们告诉QCalenderWidget。与此同时还更新了Maximum Date编辑器因为如果新的最小日期晚于当前的最大日期QCalendarWidget将自动调整其最大日期以避免矛盾状态。void Window::maximumDateChanged(QDate date) { calendar-setMaximumDate(date); minimumDateEdit-setDate(calendar-minimumDate()); }maximumDateChanged()的实现类似于minimumDateChanged()。void Window::weekdayFormatChanged() { QTextCharFormat format; format.setForeground(qvariant_castQColor( weekdayColorCombo-itemData(weekdayColorCombo-currentIndex()))); calendar-setWeekdayTextFormat(Qt::Monday, format); calendar-setWeekdayTextFormat(Qt::Tuesday, format); calendar-setWeekdayTextFormat(Qt::Wednesday, format); calendar-setWeekdayTextFormat(Qt::Thursday, format); calendar-setWeekdayTextFormat(Qt::Friday, format); }每个组合框项都有一个QColor对象作为与该项文本对应的用户数据从组合框中获取颜色后我们设置一周中每一天的文本格式。日历中列的文本格式为QTextCharFormat除了前景色外它还允许我们指定各种字符格式信息。在这个例子中我们只展示了可能性的一个子集。void Window::weekendFormatChanged() { QTextCharFormat format; format.setForeground(qvariant_castQColor( weekendColorCombo-itemData(weekendColorCombo-currentIndex()))); calendar-setWeekdayTextFormat(Qt::Saturday, format); calendar-setWeekdayTextFormat(Qt::Sunday, format); }weekendFormatChanged()与weekdayFormatChanged()相同不同之处是它影响的是周六和周日而不是周一到周五。void Window::reformatHeaders() { QString text headerTextFormatCombo-currentText(); QTextCharFormat format; if (text tr(Bold)) format.setFontWeight(QFont::Bold); else if (text tr(Italic)) format.setFontItalic(true); else if (text tr(Green)) format.setForeground(Qt::green); calendar-setHeaderTextFormat(format); }当用户更改标题的文本格式时将调用reformatHeaders()插槽。我们比较标题文本格式组合框的当前文本以确定应用哪种格式。(另一种选择是将QTextCharFormat值存储在组合框项旁边。)void Window::reformatCalendarPage() { QTextCharFormat mayFirstFormat; const QDate mayFirst(calendar-yearShown(), 5, 1); QTextCharFormat firstFridayFormat; QDate firstFriday(calendar-yearShown(), calendar-monthShown(), 1); while (firstFriday.dayOfWeek() ! Qt::Friday) firstFriday firstFriday.addDays(1); if (firstFridayCheckBox-isChecked()) { firstFridayFormat.setForeground(Qt::blue); } else { // Revert to regular colour for this day of the week. Qt::DayOfWeek dayOfWeek(static_castQt::DayOfWeek(firstFriday.dayOfWeek())); firstFridayFormat.setForeground(calendar-weekdayTextFormat(dayOfWeek).foreground()); } calendar-setDateTextFormat(firstFriday, firstFridayFormat); // When it is checked, May First in Red always takes precedence over First Friday in Blue. if (mayFirstCheckBox-isChecked()) { mayFirstFormat.setForeground(Qt::red); } else if (!firstFridayCheckBox-isChecked() || firstFriday ! mayFirst) { // We can now be certain we wont be resetting May First in Red when we restore // may 1sts regular colour for this day of the week. Qt::DayOfWeek dayOfWeek(static_castQt::DayOfWeek(mayFirst.dayOfWeek())); calendar-setDateTextFormat(mayFirst, calendar-weekdayTextFormat(dayOfWeek)); } calendar-setDateTextFormat(mayFirst, mayFirstFormat); }在reformatCalendarPage()中我们设置了该月的第一个星期五和当年的5月1日的文本格式实际使用的文本格式取决于选中了哪些复选框以及工作日/周末的格式。QCalendarWidget允许我们使用setDateTextFormat()设置单个日期的文本格式我们选择在日历页面更改时设置日期格式-即显示新的月份-以及工作日/周末格式更改时设置日期格式检查mayFirstCheckBox和firstDayCheckBox中的哪个被选中(如果有的话)并相应地设置文本格式。

相关新闻

如何用FigmaCN插件快速实现Figma界面完整汉化:设计师必备的终极指南

如何用FigmaCN插件快速实现Figma界面完整汉化:设计师必备的终极指南

如何用FigmaCN插件快速实现Figma界面完整汉化:设计师必备的终极指南 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma复杂的英文界面而苦恼吗?FigmaCN…

2026/9/19 2:29:27 阅读更多 →
AirPodsDesktop终极指南:在Windows和Linux上解锁苹果耳机完整体验的免费方案

AirPodsDesktop终极指南:在Windows和Linux上解锁苹果耳机完整体验的免费方案

AirPodsDesktop终极指南:在Windows和Linux上解锁苹果耳机完整体验的免费方案 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) 项目地址: https://gitcode.com/gh_mirrors/ai/AirPodsDes…

2026/9/15 4:31:39 阅读更多 →
VS Code使用技巧

VS Code使用技巧

文章目录1. 官网下载地址2. Windows系统版本的安装3. 必备设置禁止收集数据保存时自动删包自动修剪尾随空格多彩缩进控制你重新启动vscode窗口的模式编辑器是否使用预览模式禁止vscode自动更新4. 常用快捷键代码格式化快捷键快速查找文件夾和文件快捷鍵快速切換已經顯示在代碼編…

2026/9/18 15:07:16 阅读更多 →

最新新闻

Agent Skill 装进 Cursor 后,Archify 通过 TaoToken 生成单文件 HTML

Agent Skill 装进 Cursor 后,Archify 通过 TaoToken 生成单文件 HTML

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 9:54:25 阅读更多 →
HTML即视频源码:HyperFrames实现声明式MP4生成

HTML即视频源码:HyperFrames实现声明式MP4生成

1. 项目概述:当HTML成为视频生成的“源代码”你有没有试过,把一段HTML代码粘贴进编辑器,保存为.html文件,双击打开——浏览器里跑出来的不是网页,而是一段逐帧精确控制、时长毫秒级可调、画面元素完全确定性渲染的MP4视…

2026/9/19 9:54:25 阅读更多 →
Claude Code 代码验收实战:从能跑到敢上的完整指南

Claude Code 代码验收实战:从能跑到敢上的完整指南

1. 一个需求做完之后,我才意识到验收才是真正的深水区用 Claude Code 写代码这件事,我算是比较早开始折腾的那批人。从最早在终端里敲claude命令,到后来在 VS Code 里配好插件、调通中文启动器,再到把常用开发工具的配置摸了个遍&…

2026/9/19 9:54:25 阅读更多 →
避开90%的Django安全漏洞:Awesome Django安全包检查清单,现在就该安装

避开90%的Django安全漏洞:Awesome Django安全包检查清单,现在就该安装

避开90%的Django安全漏洞:Awesome Django安全包检查清单,现在就该安装 【免费下载链接】awesome-django A curated list of awesome things related to Django 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-django Awesome Django 是社区…

2026/9/19 9:54:25 阅读更多 →
区块链重构医院成本控制:票据、设备与供应链落地路径

区块链重构医院成本控制:票据、设备与供应链落地路径

简介:一份基于区块链技术探讨医院财务成本控制路径的学术文献,面向医院财务管理者、医疗信息化研究人员及关注“区块链医疗”落地的从业者。内容从财务数据庞杂、设备运维与耗材/药品溯源、供应商信息不对称等痛点切入,结合区块链分布式记账、…

2026/9/19 9:54:25 阅读更多 →
2026 Agent 产业全景图谱:五层架构与40+概念避坑指南

2026 Agent 产业全景图谱:五层架构与40+概念避坑指南

这两年只要打开技术社区,满屏都是 Agent、智能体、多 Agent 协作这些词。但真到要上手做项目、选架构方案的时候,很多人其实是被概念先绕晕了。我梳理了一份面向 2026 年的 Agent 产业与技术全景图谱,按“五层架构”这条主线,把从…

2026/9/19 9:53:24 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/19 3:59:36 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/19 3:53:08 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/19 4:02:43 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →