当前位置: 首页 > news >正文

「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_cast<QColor>( 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_cast<QColor>( 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_cast<Qt::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 won't be resetting "May First in Red" when we restore // may 1st's regular colour for this day of the week. Qt::DayOfWeek dayOfWeek(static_cast<Qt::DayOfWeek>(mayFirst.dayOfWeek())); calendar->setDateTextFormat(mayFirst, calendar->weekdayTextFormat(dayOfWeek)); } calendar->setDateTextFormat(mayFirst, mayFirstFormat); }

在reformatCalendarPage()中,我们设置了该月的第一个星期五和当年的5月1日的文本格式,实际使用的文本格式取决于选中了哪些复选框以及工作日/周末的格式。

QCalendarWidget允许我们使用setDateTextFormat()设置单个日期的文本格式,我们选择在日历页面更改时设置日期格式-即显示新的月份-以及工作日/周末格式更改时设置日期格式,检查mayFirstCheckBox和firstDayCheckBox中的哪个被选中(如果有的话),并相应地设置文本格式。

http://www.cnnetsun.cn/news/3626710.html

相关文章:

  • 端到端智驾算法:文章导航页
  • 2026工程水利设计公司测评:水土保持工程施工监理十大选型盘点
  • 【工控选型破局】拒绝盲目溢价与低质陷阱:基于 Modbus-RTU 状态诊断与自适应滑动中值滤波的 C++ 实战,兼论“性价比高又好用的仪器仪表厂家”选型之道
  • Internet Download Manager 6.43 Build 7 完全激活版
  • CTF-NetA终极指南:如何用智能流量分析工具破解CTF中的加密谜题
  • Python 由Excel行列数字得到单元格坐标
  • 终极显示器色彩校准指南:用novideo_srgb轻松解决广色域过饱和问题
  • FreeMove终极指南:5步快速释放C盘空间,智能迁移文件夹不破坏程序
  • android的事件分发机制
  • 品牌出海发稿哪家靠谱?深度拆解朝闻通全链路服务
  • AlienFX Tools终极指南:告别臃肿AWCC,打造轻量级Alienware控制中心
  • MCU基础
  • 系统架构设计师考试:高效备考策略与资源推荐
  • 如何快速选择最佳行情服务器:mootdx智能连接优化指南
  • 深度解析TI ADS8353/7853 ADC评估套件:从硬件设计到性能测试实战
  • 在windows10里的apache2.4加php8.2的环境下上安装Laravel10框架
  • 5分钟掌握PPT悬浮计时器:告别演讲超时的智能解决方案
  • 如何实现毫秒级歌词同步:Listen1跨平台音乐播放器的完整技术解析
  • CTF流量分析神器:5分钟掌握CTF-NetA终极指南
  • 抖音视频下载终极指南:douyin-downloader批量去水印工具完全教程
  • ELF文件与库的原理
  • 【20年ML系统老兵手记】:为什么你训出的模型一部署就崩?训练/推理数据流、内存模型、精度路径的3维撕裂分析
  • (99页PPT)全量系统业务战略架构图模板(附下载方式)
  • ADS8353/ADS7853评估套件实战:从硬件配置到软件分析的高精度ADC性能验证
  • 从状态码、请求头到 TLS 指纹的合规排查方法 TLSFOWARD抓包工具
  • 为什么你的vLLM部署比别人慢3.7倍?——2024主流推理框架(vLLM、TGI、Ollama、LightLLM)吞吐量与首token延迟全对比
  • 【信号去噪】基于小波阈值实现心电信号去噪附matlab代码
  • AMD Ryzen SDT调试工具:30分钟从新手到性能调优专家的终极指南
  • 2026外出客户拜访整理录音,怎么选合适的手机录音转文字助手
  • 高性能抖音批量下载系统:基于双重策略的自动化内容采集框架