「Qt Widget中文示例指南」如何实现一个日历?(一)

news2024/12/24 2:34:59

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

本文中的CalendarWidget示例展示了QCalendarWidget的用法。

「Qt Widget中文示例指南」如何实现一个日历?

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

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

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

QCalendarWidget的属性总结如下所示:

  • selectedDate:当前选择的日期。
  • minimumDate:可以选择的最早日期。
  • maximumDate:可以选择的最晚日期。
  • firstDayOfWeek:显示为一周的第一天的日期(通常是星期日或星期一)。
  • gridVisible:是否显示网格。
  • selectionMode:用户是否可以选择日期。
  • horizontalHeaderFormat:水平标题中日期名称的格式(例如,"M", "Mon"或"Monday")。
  • verticalHeaderFormat:垂直页眉的格式。
  • navigationBarVisible:是否显示日历小部件顶部的导航栏。

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

Window类定义

下面是Window类的定义:

class Window : public QWidget
{
Q_OBJECT

public:
Window(QWidget *parent = nullptr);

private slots:
void localeChanged(int index);
void firstDayChanged(int index);
void selectionModeChanged(int index);
void horizontalHeaderChanged(int index);
void verticalHeaderChanged(int index);
void selectedDateChanged();
void minimumDateChanged(QDate date);
void maximumDateChanged(QDate date);
void weekdayFormatChanged();
void weekendFormatChanged();
void reformatHeaders();
void reformatCalendarPage();

private:
void createPreviewGroupBox();
void createGeneralOptionsGroupBox();
void createDatesGroupBox();
void createTextFormatsGroupBox();
QComboBox *createColorComboBox();

QGroupBox *previewGroupBox;
QGridLayout *previewLayout;
QCalendarWidget *calendar;

QGroupBox *generalOptionsGroupBox;
QLabel *localeLabel;
QLabel *firstDayLabel;
...
QCheckBox *mayFirstCheckBox;
};

与表示自包含窗口的类一样,大多数API都是私有的。当我们在执行过程中偶然发现私有成员时,将对其进行审查。

Window类实现

现在让我们回顾一下类的实现,从构造函数开始:

Window::Window(QWidget *parent)
: QWidget(parent)
{
createPreviewGroupBox();
createGeneralOptionsGroupBox();
createDatesGroupBox();
createTextFormatsGroupBox();

QGridLayout *layout = new QGridLayout;
layout->addWidget(previewGroupBox, 0, 0);
layout->addWidget(generalOptionsGroupBox, 0, 1);
layout->addWidget(datesGroupBox, 1, 0);
layout->addWidget(textFormatsGroupBox, 1, 1);
layout->setSizeConstraint(QLayout::SetFixedSize);
setLayout(layout);

previewLayout->setRowMinimumHeight(0, calendar->sizeHint().height());
previewLayout->setColumnMinimumWidth(0, calendar->sizeHint().width());

setWindowTitle(tr("Calendar Widget"));
}

我们首先使用四个私有的create…GroupBox()函数创建四个qgroupbox及其子部件(包括QCalendarWidget),如下所述,然后我们在QGridLayout中安排组框。

我们将网格布局的调整大小策略设置为QLayout::SetFixedSize,以防止用户调整窗口大小。在这种模式下,窗口的大小由QGridLayout根据其内容小部件的大小提示自动设置。

为了确保在每次更改QCalendarWidget的属性(例如,隐藏导航栏、垂直标题或网格)时不会自动调整窗口的大小,我们将第0行的最小高度和第0列的最小宽度设置为QCalendarWidget的初始大小。

让我们来看看createPreviewGroupBox()函数:

void Window::createPreviewGroupBox()
{
previewGroupBox = new QGroupBox(tr("Preview"));

calendar = new QCalendarWidget;
calendar->setMinimumDate(QDate(1900, 1, 1));
calendar->setMaximumDate(QDate(3000, 1, 1));
calendar->setGridVisible(true);

connect(calendar, &QCalendarWidget::currentPageChanged,
this, &Window::reformatCalendarPage);

previewLayout = new QGridLayout;
previewLayout->addWidget(calendar, 0, 0, Qt::AlignCenter);
previewGroupBox->setLayout(previewLayout);
}

Preview组框只包含一个小部件:QCalendarWidget。我们设置它,将它的currentPageChanged()信号连接到reformatCalendarPage()插槽,以确保每个新页面都获得用户指定的格式。

createGeneralOptionsGroupBox()函数有点大,并且以相同的方式设置了几个小部件。我们将在这里查看它的部分实现,并跳过其余部分:

void Window::createGeneralOptionsGroupBox()
{
generalOptionsGroupBox = new QGroupBox(tr("General Options"));

localeCombo = new QComboBox;
int curLocaleIndex = -1;
int index = 0;
for (int _lang = QLocale::C; _lang <= QLocale::LastLanguage; ++_lang) {
QLocale::Language lang = static_cast<QLocale::Language>(_lang);
const auto locales =
QLocale::matchingLocales(lang, QLocale::AnyScript, QLocale::AnyTerritory);
for (auto loc : locales) {
QString label = QLocale::languageToString(lang);
auto territory = loc.territory();
label += QLatin1Char('/');
label += QLocale::territoryToString(territory);
if (locale().language() == lang && locale().territory() == territory)
curLocaleIndex = index;
localeCombo->addItem(label, loc);
++index;
}
}
if (curLocaleIndex != -1)
localeCombo->setCurrentIndex(curLocaleIndex);
localeLabel = new QLabel(tr("&Locale"));
localeLabel->setBuddy(localeCombo);

firstDayCombo = new QComboBox;
firstDayCombo->addItem(tr("Sunday"), Qt::Sunday);
firstDayCombo->addItem(tr("Monday"), Qt::Monday);
firstDayCombo->addItem(tr("Tuesday"), Qt::Tuesday);
firstDayCombo->addItem(tr("Wednesday"), Qt::Wednesday);
firstDayCombo->addItem(tr("Thursday"), Qt::Thursday);
firstDayCombo->addItem(tr("Friday"), Qt::Friday);
firstDayCombo->addItem(tr("Saturday"), Qt::Saturday);

firstDayLabel = new QLabel(tr("Wee&k starts on:"));
firstDayLabel->setBuddy(firstDayCombo);
...

篇幅有限,更多内容持续关注,下期见~

Qt Widget组件推荐
  • QtitanRibbon - Ribbon UI组件:是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibbon致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart - Qt类图表组件:是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。
  • QtitanDataGrid - Qt网格组件:提供了一套完整的标准 QTableView 函数和传统组件无法实现的独特功能。使您能够将不同来源的各类数据加载到一个快速、灵活且功能强大的可编辑网格中,支持排序、分组、报告、创建带状列、拖放按钮和许多其他方便的功能。
  • QtitanDocking:允许您像 Visual Studio 一样为您的伟大应用程序配备可停靠面板和可停靠工具栏。黑色、白色、蓝色调色板完全支持 Visual Studio 2019 主题!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1352508.html

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

相关文章

开源MIT协议软件 - ChatGPT Admin Web

ChatGPT Admin Web 在团队和组织内共享使用人工智能的一站式解决方案。 ​编辑 ​编辑 ​编辑 CAW 是一个自托管网络应用程序&#xff0c;提供开箱即用的用户管理&#xff0c;包括后台界面以及可配置的支付计划和相关支付界面。 GitHub Sponsor / 爱发电 功能 Features …

React使用动态标签名称

最近在一项目里&#xff08;React antd&#xff09;遇到一个需求&#xff0c;某项基础信息里有个图标配置&#xff08;图标用的是antd的Icon组件&#xff09;&#xff0c;该项基础信息的图标信息修改后&#xff0c;存于后台数据库&#xff0c;后台数据库里存的是antd Icon组件…

【办公技巧】word文档怎么隐藏文字呢?word隐藏文字的四种方法!

Word文件制作完毕后&#xff0c;有些部分不想别让人看到&#xff0c;又不想删掉&#xff0c;把么我们可以隐藏文字&#xff0c;今天分享几个隐藏文字的方法给大家~ 方法一&#xff1a; 最简单的方法&#xff0c;将字体颜色与背景颜色设置为一致的&#xff0c;这样就达到了隐藏…

《Vue3 前端构建工具》 Vue-cli 与 Vite 创建项目的插件和配置对比

前言 2024 年 啦&#xff01;Vue2 也于 2023.12.31 寿终正寝 &#xff01; 然而我的 Vue3 升级一再拖延&#xff08;惭愧不已&#xff09;~ 赶起来吧~ 今天用 vue-cli 和 vite 分别创建了 Vue3 项目&#xff0c;具体实现步骤见如下两篇。 《基于 Vue Cli4.x Vue3 TS styl…

论文润色降重多少钱 智能写作

大家好&#xff0c;今天来聊聊论文润色降重多少钱 智能写作&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;论文润色降重多少钱――了解市场行情与选择合…

【MPC学习笔记】02:MPC详细简介(Lecture 1_1 Unconstrained MPC)

本笔记来自北航诸兵老师的课程 课程地址&#xff1a;模型预测控制&#xff08;2022春&#xff09;lecture 1-1 Unconstrained MPC 接上一篇&#xff1a;【MPC学习笔记】01&#xff1a;MPC简介&#xff08;Lecture 1_1 Unconstrained MPC&#xff09; 文章目录 1 详细介绍1.1 状…

​ubuntu安装远程桌面 ​Xfce

本文最先发布在&#xff1a;https://www.itcoder.tech/posts/how-to-install-xrdp-on-ubuntu-20-04/ Xrdp 是一个微软远程桌面协议&#xff08;RDP&#xff09;的开源实现&#xff0c;它允许你通过图形界面控制远程系统。通过 RDP&#xff0c;你可以登录远程机器&#xff0c;并…

从 YOLOv1 到 YOLO-NAS 的所有 YOLO 模型:论文解析

在计算机视觉的浩瀚领域&#xff0c;有一支耀眼的明星&#xff0c;她的名字传颂着革新与突破的传奇——YOLO&#xff08;You Only Look Once&#xff09;。回溯时光&#xff0c;走进这个引人注目的名字背后&#xff0c;我们仿佛穿越进一幅画卷&#xff0c;一幅展现创新魅力与技…

论文润色会泄露吗 智能写作

大家好&#xff0c;今天来聊聊论文润色会泄露吗 智能写作&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;论文润色会泄露吗――保护学术隐私与安全的探讨…

单机游戏推荐:少年骇客:能量之旅 中文免安装版

邪恶的骇尸诅咒了欧洲 - 只有少年骇客能制止他&#xff01;在你奋力拯救世界的冒险历程中&#xff0c;探索这个充满了战斗、谜题和秘密的 3D 世界&#xff01; 游戏介绍 田小班和他的家人们正在享受悠闲的欧洲假期。值此之际&#xff0c;邪恶的骇尸唤醒了四个神秘水晶&#xff…

数字化消费新趋势:跨境电商如何满足未来消费者需求?

在数字化浪潮的推动下&#xff0c;全球消费者的行为和期望正在发生根本性的变化。跨境电商作为连接全球的桥梁&#xff0c;不仅促进了商品的自由流通&#xff0c;更需迎接未来数字化消费的新趋势。本文将深入探讨未来数字化消费的趋势&#xff0c;以及跨境电商如何有效满足这些…

Halcon3D篇-深度图与halcon模型互转

关于3D相机采图部分&#xff0c;可以参考我们LMISDK的二次开发程序&#xff1a; https://blog.csdn.net/m0_51559565/article/details/134404394 一&#xff1a;读取彩色3D融合图进行转化模型 *读取3通道彩色融合图 read_image (Image, E:/UpperComputer/3D检测/3D平面度检测…

Eureka服务注册与发现中心

简介 Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理 在传统的RPC远程调用框架中&#xff0c;管理每个服务与服务之间依赖关系比较复杂&#xff0c;管理比较复杂&#xff0c;所以需要使用服务治理&#xff0c;管理服务于服务之间依赖关系&#xff0c;可以实现…

element中Tree 树形控件实现节点过滤和懒加载节点

目录 1.代码实现2. 效果图3. 使用到的部分属性说明4. 更多属性配置查看element官网 1.代码实现 <template><div class"TreePage"><el-row :gutter"20"><!--村数据--><el-col :span"24"><div class"head-…

LobeChat:搭建你的私人 GPT!

前端训练营&#xff1a;1v1私教&#xff0c;终身辅导计划&#xff0c;帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~ Hello&#xff0c;大家好&#xff0c;我是 Sunday。 之前有同学问我&#xff1a;“老师&#xff0c;我想要搭建一个个人的 …

学习Java中的数据结构及API这一篇就够了

Java中的数据结构及API 1. 线性表1-1. 顺序表Array数组ArrayList集合 1-2. 链表自定义链表LinkedList 2. 队列2-1. ArrayDeque2-2. LinkedList2-3. 区别 3. 栈3-1. ArrayDeque3-2. LinkedList 4. 树4-1. 二叉树定义 5. 图5-1. 图定义 1. 线性表 1-1. 顺序表 顺序表是指用一组…

数据库(五)数据库设计 | 实体关系模型ER model 映射基数 弱实体集 实体关系设计

文章目录 1 实体关系模型 ER模型ER model1.1 E-R模型结构1.1.1 实体和实体集1.1.2 属性1.1.3 关系集合 1.2 ER关系图绘制1.2.1 实体集绘制1.2.2 关系集绘制 2 映射基数 Mapping Cardinalities2.1 映射基数类型2.1.1 一对一2.1.2 一对多2.1.3 多对一2.1.4 多对多 2.2 全部或部分…

stable diffusion WebUI基础-安装

电脑配置要求 N卡显存6G起(建议直接上12G)内存建议16G,8G也可固态盘500G以上CPU i5即可魔法上网虚拟环境安装python 我非常不建议直接在自己的电脑里直接装python,因为现在很多项目的环境比较乱,对于stable diffusion 尽可能有一个干净的python 环境最好,所以我推荐使用mi…

SpingBoot的项目实战--模拟电商【3.购物车模块】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringBoot电商项目的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.功能需求 二.代码编写 …

国内的数据安全与隐私保护现状如何?

在过去的几年中&#xff0c;中国已经采取了一系列的措施来应对数据安全和隐私保护的挑战。 法律法规 中国已经出台了一系列的法律法规来保护数据安全和隐私。例如&#xff0c;《中华人民共和国数据安全法》和《中华人民共和国个人信息保护法》等法律已经在2021年颁布施行。此外…