界面开发框架Qt新手入门教程:如何使用Calendar组件创建日历(二)

news2024/12/24 2:27:23

Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。

本文中的CalendarWidget示例展示了QCalendarWidget的用法。在上文中(点击这里回顾>>),我们为大家介绍了窗口类的定义和部分窗口类的实现,本节将继续为大家讲解窗口类的实现。

点击获取Qt Widget组件下载(Q技术交流:166830288)

QCalendarWidget一次显示一个日历月,并允许用户选择一个日期。日历由四个组件组成:一个允许用户更改显示月份的导航栏、一个网格,其中每个单元格表示一个月中的一天,以及两个显示星期名称和星期数字的标题。

Calendar Widget示例显示一个QCalendarWidget,并允许用户使用QComboBoxes、QCheckBoxes和QDateEdits配置其外观和操作,此外,用户可以影响单个日期和标题的格式。

本示例包含一个类Window,它创建并布局QCalendarWidget和其他让用户配置QCalendarWidget的小部件。

窗口类实现

现在让我们看一下createDatesGroupBox()私有函数:

void Window::createDatesGroupBox()
{
datesGroupBox = new QGroupBox(tr("Dates"));

minimumDateEdit = new QDateEdit;
minimumDateEdit->setDisplayFormat("MMM d yyyy");
minimumDateEdit->setDateRange(calendar->minimumDate(),
calendar->maximumDate());
minimumDateEdit->setDate(calendar->minimumDate());

minimumDateLabel = new QLabel(tr("&Minimum Date:"));
minimumDateLabel->setBuddy(minimumDateEdit);

currentDateEdit = new QDateEdit;
currentDateEdit->setDisplayFormat("MMM d yyyy");
currentDateEdit->setDate(calendar->selectedDate());
currentDateEdit->setDateRange(calendar->minimumDate(),
calendar->maximumDate());

currentDateLabel = new QLabel(tr("&Current Date:"));
currentDateLabel->setBuddy(currentDateEdit);

maximumDateEdit = new QDateEdit;
maximumDateEdit->setDisplayFormat("MMM d yyyy");
maximumDateEdit->setDateRange(calendar->minimumDate(),
calendar->maximumDate());
maximumDateEdit->setDate(calendar->maximumDate());

maximumDateLabel = new QLabel(tr("Ma&ximum Date:"));
maximumDateLabel->setBuddy(maximumDateEdit);

在这个函数中,我们创建Minimum Date, Maximum Date和Current Date编辑器小部件,它们控制日历的最小日期、最大日期和所选日期。日历的最小和最大日期已经在createPrivewGroupBox()中设置;然后我们可以将小部件的默认值设置为日历值。

connect(currentDateEdit, &QDateEdit::dateChanged,
calendar, &QCalendarWidget::setSelectedDate);
connect(calendar, &QCalendarWidget::selectionChanged,
this, &Window::selectedDateChanged);
connect(minimumDateEdit, &QDateEdit::dateChanged,
this, &Window::minimumDateChanged);
connect(maximumDateEdit, &QDateEdit::dateChanged,
this, &Window::maximumDateChanged);
...
}

我们将currentDateEdit的dateChanged()信号直接连接到日历的setSelectedDate()插槽,当日历所选日期发生更改时,无论是由于用户操作还是通过编程方式,selectedDateChanged()槽都会更新Current date编辑器,我们还需要在用户 Minimum Date和Maximum Date时做出反应。

下面是createTextFormatsGroup()函数:

void Window::createTextFormatsGroupBox()
{
textFormatsGroupBox = new QGroupBox(tr("Text Formats"));

weekdayColorCombo = createColorComboBox();
weekdayColorCombo->setCurrentIndex(
weekdayColorCombo->findText(tr("Black")));

weekdayColorLabel = new QLabel(tr("&Weekday color:"));
weekdayColorLabel->setBuddy(weekdayColorCombo);

weekendColorCombo = createColorComboBox();
weekendColorCombo->setCurrentIndex(
weekendColorCombo->findText(tr("Red")));

weekendColorLabel = new QLabel(tr("Week&end color:"));
weekendColorLabel->setBuddy(weekendColorCombo);

我们使用createColorCombo()来设置工作日颜色和周末颜色组合框,它实例化了一个QComboBox,并用颜色("Red", "Blue"等)填充它。

headerTextFormatCombo = new QComboBox;
headerTextFormatCombo->addItem(tr("Bold"));
headerTextFormatCombo->addItem(tr("Italic"));
headerTextFormatCombo->addItem(tr("Plain"));

headerTextFormatLabel = new QLabel(tr("&Header text:"));
headerTextFormatLabel->setBuddy(headerTextFormatCombo);

firstFridayCheckBox = new QCheckBox(tr("&First Friday in blue"));

mayFirstCheckBox = new QCheckBox(tr("May &1 in red"));

Header Text Format组合框允许用户更改用于水平和垂直标题的文本格式(粗体、斜体或普通), First Friday in blue和May 1 in red复选框会影响特定日期的呈现。

connect(weekdayColorCombo, &QComboBox::currentIndexChanged,
this, &Window::weekdayFormatChanged);
connect(weekdayColorCombo, &QComboBox::currentIndexChanged,
this, &Window::reformatCalendarPage);
connect(weekendColorCombo, &QComboBox::currentIndexChanged,
this, &Window::weekendFormatChanged);
connect(weekendColorCombo, &QComboBox::currentIndexChanged,
this, &Window::reformatCalendarPage);
connect(headerTextFormatCombo, &QComboBox::currentIndexChanged,
this, &Window::reformatHeaders);
connect(firstFridayCheckBox, &QCheckBox::toggled,
this, &Window::reformatCalendarPage);
connect(mayFirstCheckBox, &QCheckBox::toggled,
this, &Window::reformatCalendarPage);

我们将复选框和组合框连接到各种私有插槽,First Friday in blue和May 1 in red复选框连接到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对象)。

此函数用于设置Weekday Color和Weekend Color组合框。

void Window::firstDayChanged(int index)
{
calendar->setFirstDayOfWeek(Qt::DayOfWeek(
firstDayCombo->itemData(index).toInt()));
}

当用户更改组合框值上的Week starts时,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()相同,不同之处是它影响的是周六和周日,而不是周一到周五。

当用户更改标题的文本格式时,将调用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.coloradmin.cn/o/698848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于区块链技术的旅游积分通兑系统设计

基于区块链技术的旅游积分通兑系统设计 贵向泉1,2, 郭志礼1, 杨裔2,3&#xff0c;秦炳峰4 1 兰州理工大学计算机与通信学院&#xff0c;甘肃 兰州 730050 2 兰州大学旅游信息融合处理与数据权属保护文化和旅游部重点实验室&#xff0c;甘肃 兰州 730000 3 兰州大学信息科学与工…

Linux驱动学习(4) MTD字符驱动和块驱动3

系列文章目录 Linux驱动学习&#xff08;4&#xff09; MTD字符驱动和块驱动1 Linux驱动学习&#xff08;4&#xff09; MTD字符驱动和块驱动2 Linux驱动学习&#xff08;4&#xff09; MTD字符驱动和块驱动3 文章目录 目录 系列文章目录 文章目录 前言 二、MTD块设备驱…

NXP i.MX 6ULL工业核心板硬件说明书( ARM Cortex-A7,主频792MHz)

1 硬件资源 创龙科技SOM-TLIMX6U是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的低成本工业级核心板&#xff0c;主频792MHz&#xff0c;通过邮票孔连接方式引出Ethernet、UART、CAN、LCD、USB等接口。核心板经过专业的PCB Layout和高低温测试验证&…

一篇文章带你从入门都入土 RocketMQ 消息中间件

目录 一、下载、安装 二、基本演示 2.1 创建项目导入依赖 2.2 生产者发送消息 2.3 消费者消费消息 三、topic 、broker、messageQueue之间的关系 四、普通消息 4.1 普通消息生命周期 4.2 可靠同步发送 4.3 可靠异步发送 4.4 单向发送 五、顺序消息 5.1 如何保证消…

机器学习之朴素贝叶斯(Naive Bayes)

1 朴素贝叶斯算法介绍 朴素贝叶斯是经典的机器学习算法之一&#xff0c;也是为数不多的基于概率论的分类算法。朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论&#xff0c;有着坚实的数学基础&#xff0c;以及稳定的分类效率&#xff0c;是应用最为广泛的…

python发送邮件,超简单!

1、我的使用场景 最近有几个爬虫定时任务在运行&#xff0c;需要及时知道发生异常&#xff0c;以便于处理&#xff0c;于是&#xff0c;想到了邮件&#xff0c;记录一下。 2、邮箱服务设置 我是专门为这个脚本注册的&#xff0c;如果有&#xff0c;也可以不注册。 注册完&a…

Transformer(四)--实现验证:transformer 机器翻译实践

转载请注明出处&#xff1a;https://blog.csdn.net/nocml/article/details/125711025 本系列传送门&#xff1a; Transformer(一)–论文翻译&#xff1a;Attention Is All You Need 中文版 Transformer(二)–论文理解&#xff1a;transformer 结构详解 Transformer(三)–论文实…

sql server 触发器往链接服务器同步数据的坑

链接服务器无法启动分布式服务 检查数据库是否勾选了一下按钮&#xff0c;双方都要检查 链接服务器属性&#xff0c;需要检查这些地方是否已经设置为true 该伙伴事务管理器已经禁止了它对远程/网络事务的支持 双方启动MSDTC服务 (1)在windows控制面版–>windows 工具->…

Sourcetree: The host key is not cached for this server:

使用Sourcetree 出现提示&#xff1a;The host key is not cached for this server: 工具>选项>一般 确认完成&#xff0c;解决问题。

【嵌入式Qt开发入门】使用 UI 设计器开发程序

本文我们继续学习如何使用 Qt Designer 开发程序&#xff0c;Qt Designer 是属于 Qt Creator 的一个功能而已&#xff0c;大家不要搞混了。Qt Designer 也叫 UI 设计师或者 UI 设计器&#xff0c;这都是指的同一 个东西。下面简单介绍如何使用 UI 设计器开发程序&#xff0c;以…

webassembly如何在js侧使用注册的容器类型

需求&#xff1a;是有个C接口&#xff0c;参数是vector<string>类型&#xff0c;那么如何在js端调用这个接口呢&#xff1f; #include <emscripten/emscripten.h> #include <emscripten/bind.h> #include <vector> #include <string> #include …

Modbus Slave和Modbus Poll的使用说明

文章目录 1 软件说明2 本例目标3 Modbus Poll配置步骤4 Modbus Slave配置步骤5 各种测试5.1 正常显示5.2 Slave Id不一致5.3 Quantity不够5.4 测试IP Address 6 总结 1 软件说明 Modbus Poll&#xff1a;是Witte Software公司开发的的Modbus主机仿真器&#xff0c;用于测试和调…

2022年影响因子新鲜出炉!(附↓)

【SciencePub学术】6月28日,科睿唯安发布2023年度《期刊引证报告》&#xff08;Journal Citation Reports&#xff0c;简称 JCR&#xff09;。 本年度《引证报告》对Web of Science核心合集收录的所有期刊赋予期刊影响因子&#xff0c;同时&#xff0c;为鼓励用户在比较期刊时…

续篇-docker篇: 优势与安装方式 及基础指令整合

目录 1. 前言简介: 1.1 docker的优势: 1.2 docker的简易理解 2. 指令安装 2.1 安装yum的插件 ps: 提示没权限加上sudo即可 root用户不用 2.2 设置yum仓库地址 ps: 设置多个镜像仓库, 不设置可能会下载变慢 ps: 如图所示 2.3 更新缓存 2.4 安装docker 2.5 查看do…

Spring Boot 中的事务超时时间

Spring Boot 中的事务超时时间 在 Spring Boot 中&#xff0c;事务管理是一个非常重要的话题。当我们在数据库中执行一些复杂的操作时&#xff0c;需要确保这些操作能够在一定的时间内完成&#xff0c;否则可能会导致数据一致性问题。为了解决这个问题&#xff0c;Spring Boot…

Linux--12--Kernel panic – not syncing: Attempted to kill init! Redhat6.2故障修复

1、Linux环境 Redhat6.2&#xff0c; Linux version 2.6.32-220.el6.i686 (mockbuildx86-003.build.bos.redhat.com) (gccversion 4,4.5 20110214 (Red Hat 4.4.5-6) (GCC) ) #1 SMP Wed Nov 9 08:02:18 EST 2011 2、故障现象 修改TCP相关文件&#xff0c;重启完Linux系统之…

ModaHub魔搭社区:Milvus的工作原理和为什么选择Milvus?

目录 为什么选择 Milvus&#xff1f; Milvus 的工作原理是什么&#xff1f; Milvus 由存储层和计算层组成&#xff0c;为了增强弹性和灵活性&#xff0c;Milvus 中的所有组件都是无状态的。系统由四个层级组成&#xff1a; Milvus 用于什么&#xff1f; 如今&#xff0c;已…

java学习记录之struts2struts标签上传国际化

Strtus2 OGNL表达式的结合 描述: struts2为OGNL表达式准备了两个对象 ActionContext: 作为ognl表达式的Context valueStack: 作为ognl表达式的Root 以上两个对象的创建 都是strutsPrepareAndExecuteFilter中准备好. Ognl和Struts使用上的结合: 表单提交,其中提交的键可以看作…

iview切换Select时选项丢失,重置Seletc时选项丢失

分析原因 在旧版本的iview中如果和filterable一起使用时&#xff0c;当值清空选项或者使用重置按钮清空时选项会丢失。 解决方式一 把去掉filterable 解决方式二 使用ref&#xff0c;调用clearSingleSelect()方法清空 ref"perfSelect" this.$refs.perfSelect.c…

Nginx上游节点健康检测

Nginx默认是没有支持上游节点健康检测的。 可以使用Tengine 文档 - The Tengine Web Server 或者自行下载nginx然后自己安装nginx_upstream_check_module 模块 在linux下载nginx wget http://nginx.org/download/nginx-1.25.1.tar.gz 下载插件 GitHub - yaoweibin/nginx_u…