「Qt Widget中文示例指南」如何实现一个旋转框(二)

news2024/12/28 6:55:42

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

旋转框示例展示了如何使用Qt 中可用的许多不同类型的旋转框,从简单的QSpinBox部件到更复杂的编辑器,如QDateTimeEdit 部件。

点击获取Qt Widget组件下载

「Qt Widget中文示例指南」如何实现一个旋转框

该示例包含一个Window类,用于显示Qt中可用的不同基于旋转框的小部件。

在上文中(点击这里回顾>>),我们为大家介绍了实现旋转框的Window类定义和部分Window类实现内容,本文将继续讲解如何实现Window类。

Window类实现

createDateTimeEdits()函数构造另一个组框,其中包含用于编辑日期和时间的旋转框。

void Window::createDateTimeEdits()
{
editsGroup = new QGroupBox(tr("Date and time spin boxes"));

QLabel *dateLabel = new QLabel;
QDateEdit *dateEdit = new QDateEdit(QDate::currentDate());
dateEdit->setDateRange(QDate(2005, 1, 1), QDate(2010, 12, 31));
dateLabel->setText(tr("Appointment date (between %0 and %1):")
.arg(dateEdit->minimumDate().toString(Qt::ISODate))
.arg(dateEdit->maximumDate().toString(Qt::ISODate)));

第一个旋转框是QDateEdit小部件,它能够接受使用QDate值指定的给定范围内的日期,当光标位于相关区域时,可以使用箭头按钮和上下键来增加和减少年、月和日的值。

第二个旋转框是QTimeEdit小部件:

QLabel *timeLabel = new QLabel;
QTimeEdit *timeEdit = new QTimeEdit(QTime::currentTime());
timeEdit->setTimeRange(QTime(9, 0, 0, 0), QTime(16, 30, 0, 0));
timeLabel->setText(tr("Appointment time (between %0 and %1):")
.arg(timeEdit->minimumTime().toString(Qt::ISODate))
.arg(timeEdit->maximumTime().toString(Qt::ISODate)));

可接受的时间值是使用QTime 值定义的。

第三个旋转框是一个QDateTimeEdit小部件,它可以显示日期和时间值,我们在其上方放置一个标签,以指示会议允许的时间范围。当用户更改格式字符串时,这些小部件将被更新。

meetingLabel = new QLabel;
meetingEdit = new QDateTimeEdit(QDateTime::currentDateTime());

日期时间编辑器使用的格式字符串(也显示在标签显示的字符串中)是从组合框中的一组字符串中选择的:

QLabel *formatLabel = new QLabel(tr("Format string for the meeting date "
"and time:"));
QComboBox *formatComboBox = new QComboBox;
formatComboBox->addItem("yyyy-MM-dd hh:mm:ss (zzz 'ms')");
formatComboBox->addItem("hh:mm:ss MM/dd/yyyy");
formatComboBox->addItem("hh:mm:ss dd/MM/yyyy");
formatComboBox->addItem("hh:mm:ss");
formatComboBox->addItem("hh:mm ap");

connect(formatComboBox, &QComboBox::textActivated,
this, &Window::setFormatString);

来自这个组合框的信号被连接到Window类中的一个槽(稍后会显示)。

QVBoxLayout *editsLayout = new QVBoxLayout;
editsLayout->addWidget(dateLabel);
editsLayout->addWidget(dateEdit);
editsLayout->addWidget(timeLabel);
editsLayout->addWidget(timeEdit);
editsLayout->addWidget(meetingLabel);
editsLayout->addWidget(meetingEdit);
editsLayout->addWidget(formatLabel);
editsLayout->addWidget(formatComboBox);
editsGroup->setLayout(editsLayout);
}

组框的每个子部件都放置在一个布局中。

每当用户在组合框中选择新的格式字符串时,就调用setFormatString()槽。QDateTimeEdit小部件的显示格式是使用信号传递的原始字符串设置的:

void Window::setFormatString(const QString &formatString)
{
meetingEdit->setDisplayFormat(formatString);

根据小部件中可见的部分,我们设置一个新的日期或时间范围,并更新相关的标签,为用户提供相关信息:

if (meetingEdit->displayedSections() & QDateTimeEdit::DateSections_Mask) {
meetingEdit->setDateRange(QDate(2004, 11, 1), QDate(2005, 11, 30));
meetingLabel->setText(tr("Meeting date (between %0 and %1):")
.arg(meetingEdit->minimumDate().toString(Qt::ISODate))
.arg(meetingEdit->maximumDate().toString(Qt::ISODate)));
} else {
meetingEdit->setTimeRange(QTime(0, 7, 20, 0), QTime(21, 0, 0, 0));
meetingLabel->setText(tr("Meeting time (between %0 and %1):")
.arg(meetingEdit->minimumTime().toString(Qt::ISODate))
.arg(meetingEdit->maximumTime().toString(Qt::ISODate)));
}
}

当格式字符串改变时,将会有一个适当的标签和输入小部件,用于日期、时间或两种类型的输入。

createDoubleSpinBoxes()函数构造了三个旋转盒,用于输入双精度浮点数:

void Window::createDoubleSpinBoxes()
{
doubleSpinBoxesGroup = new QGroupBox(tr("Double precision spinboxes"));

QLabel *precisionLabel = new QLabel(tr("Number of decimal places "
"to show:"));
QSpinBox *precisionSpinBox = new QSpinBox;
precisionSpinBox->setRange(0, 100);
precisionSpinBox->setValue(2);

在构造QDoubleSpinBox小部件之前,我们创建一个旋转框来控制它们显示的小数位数。默认情况下,下面的旋转框中只显示两个小数点,每个旋转框都相当于createSpinBoxes()函数创建的组中的一个旋转框。

第一个双旋转框显示了一个基本的双精度旋转框,它的范围、步长和默认值与createSpinBoxes()函数中的第一个旋转框相同:

QLabel *doubleLabel = new QLabel(tr("Enter a value between "
"%1 and %2:").arg(-20).arg(20));
doubleSpinBox = new QDoubleSpinBox;
doubleSpinBox->setRange(-20.0, 20.0);
doubleSpinBox->setSingleStep(1.0);
doubleSpinBox->setValue(0.0);

但是,这个旋转框也允许输入非整数值。

第二个旋转框显示一个后缀,并显示一个特殊值,而不是最小值:

QLabel *scaleLabel = new QLabel(tr("Enter a scale factor between "
"%1 and %2:").arg(0).arg(1000.0));
scaleSpinBox = new QDoubleSpinBox;
scaleSpinBox->setRange(0.0, 1000.0);
scaleSpinBox->setSingleStep(10.0);
scaleSpinBox->setSuffix("%");
scaleSpinBox->setSpecialValueText(tr("No scaling"));
scaleSpinBox->setValue(100.0);

第三个旋转框显示前缀替代后缀:

QLabel *priceLabel = new QLabel(tr("Enter a price between "
"%1 and %2:").arg(0).arg(1000));
priceSpinBox = new QDoubleSpinBox;
priceSpinBox->setRange(0.0, 1000.0);
priceSpinBox->setSingleStep(1.0);
priceSpinBox->setPrefix("$");
priceSpinBox->setValue(99.99);

connect(precisionSpinBox, &QSpinBox::valueChanged,

我们将指定精度的QSpinBox小部件连接到Window类中的一个槽。

QVBoxLayout *spinBoxLayout = new QVBoxLayout;
spinBoxLayout->addWidget(precisionLabel);
spinBoxLayout->addWidget(precisionSpinBox);
spinBoxLayout->addWidget(doubleLabel);
spinBoxLayout->addWidget(doubleSpinBox);
spinBoxLayout->addWidget(scaleLabel);
spinBoxLayout->addWidget(scaleSpinBox);
spinBoxLayout->addWidget(priceLabel);
spinBoxLayout->addWidget(priceSpinBox);
spinBoxLayout->addWidget(groupSeparatorChkBox);
spinBoxLayout->addWidget(groupSeparatorSpinBox_d);
doubleSpinBoxesGroup->setLayout(spinBoxLayout);
}

该函数的其余部分将每个小部件放置到组框的布局中。

当用户改变精密旋转框中的值时,调用changePrecision()槽:

void Window::changePrecision(int decimals)
{
doubleSpinBox->setDecimals(decimals);
scaleSpinBox->setDecimals(decimals);
priceSpinBox->setDecimals(decimals);
}

该函数仅使用信号提供的整数来指定每个QDoubleSpinBox小部件中的小数位数,当它们的小数属性被更改时,它们中的每一个都将自动更新。

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/2058983.html

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

相关文章

别选错了!一篇文章讲清Midjourney 和 Stable Diffusion的区别

24年无疑标志着AI时代的崭新篇章,各类AI软件如同春日里迅速生长的竹笋,层出不穷,其功能之丰富令人目不暇接,竞相在各自的领域内抢占前沿阵地。 在众多 AI 绘画工具中,Midjourney 和 Stable Diffusion 是最为人熟知的两…

大数据背景下基于Python的牛油果销售数据可视化分析

注:源码在最后,只是一次实验记录,不合理的地方自行修改。 一 研究背景及意义 21世纪以来,随着科学技术的进步,人们的生活水平也随之大幅提升提高。在科技和经济快速发展下,全球已经进入了大数据时代。大数…

Stable Diffusion 适合亚洲人的摄影级画质LEOSAM‘s HelloWorld XL 大模型V6版本来啦!

前言 LEOSAM’s HelloWorld XL大模型早在SD1.5时代,就曾经被多次推荐,该作者LEOSAM于4月20日发布了其最新LEOSAM’s HelloWorld XL V6版本大模型。该模型在摄影、光影等方面表现非常优秀。HelloWorld XL V6版本是在V5版本的基础上迭代改进的。根据作者LE…

【JAVA入门】Day23 - 查找算法

【JAVA入门】Day23 - 查找算法 文章目录 【JAVA入门】Day23 - 查找算法一、基本查找二、二分查找 / 折半查找三、分块查找 查找算法我们常用的有: 基本查找二分查找 / 折半查找分块查找插值查找斐波那契查找树表查找哈希查找 这里我们着重讲解前三种,其…

计算机Java项目|基于SpringBoot的精简博客系统的设计与实现

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参…

第47课 Scratch入门篇:水果忍者

水果忍者 故事背景: 水果忍者是一款传统的非常好玩的游戏,我们通过鼠标控制水果刀,把弹出的水果切掉,如果切到地雷则扣分,这款游戏非常好玩,现在我们现在通过Scratch 把它做出来,! 程序原理: 这款游戏难点就是水果的抛起和下降,由于角色是从下往上走,也就是 Y 坐标…

ip归属地换地方了会自动更新吗

在这个数字化时代,互联网已成为我们生活、工作和学习中不可或缺的一部分。而每一个连接互联网的设备,都会通过其IP地址与外界进行通信。IP地址,这个看似简单的数字组合,实则承载着设备位置、网络身份等重要信息。随着人们移动性的…

重生奇迹MU:穿越时光的辉煌篇章

在远古的曙光中,奇迹重现,MU大陆迎来了前所未有的荣耀重生!重生奇迹MU,一款融合经典与创新,跨越时空界限的奇迹之旅,邀您共赴一场梦幻与热血交织的冒险盛宴。 经典重塑,传奇再续 重拾昔日辉煌…

贝叶斯神经网络bnn pyro 包 bayesian-neural-network在人工智能领域应用,预测金融市场价格

在人工智能领域,预测金融市场价格一直是一个热门话题。本文将介绍一种新颖的方法——贝叶斯神经网络,用于预测市场动态,以虚拟货币“以太币”为例进行说明。 ### 贝叶斯神经网络:一种新视角 对于希望深入了解贝叶斯神经网络的读者…

【递归专题一】Pow(x,n)-快速幂算法

Pow(x,n)-递归及迭代实现 题目链接:Pow(x,n) 解法一:暴力循环 如210则用10个2相乘,但是如果n231-1,难道我们还要用n231-1个2相乘吗?这样显然会超时。 解法二:快速幂算法 递归实现 任意数的指数都可以用二…

骑行耳机怎么选?精选五款权威实测热卖机型

作为一位深耕于运动科技领域多年的博主,可以说在此之间测试评论过各类运动装备,其中对于骑行爱好者而言,不可或缺的就是一款可以提高骑行体验的蓝牙耳机,其中,骨传导耳机凭借佩戴舒适健康等特点,收获了各类…

[星瞳科技]OpenMV如何进行串口通信?

串口通信上 视频教程27 - 串口通信发送数据:OpenMV串口发送数据 | 星瞳科技 视频教程28 - 串口通信接收数据:OpenMV串口接收数据 | 星瞳科技 介绍 为什么要用串口呢?因为要时候需要把信息传给其他MCU,串口简单,通用…

Qt-enable介绍使用(10)

目录 enable() 描述 相关 使用 观察切换过程 enable() 描述 相关 使用 观察切换过程 我们新建一个项目,设置两个按钮,并且把第二个按钮的objectName改一个明显的名字 关于名字这一点补充,显然我们在实际中要注意对象名字要尽量的通俗易…

C语言中函数sizeof和strlen区别

sizeof和strlen是C语言中的两个常用函数,它们的作用和使用方式有所不同。 sizeof sizeof是一个运算符而非函数,用于计算数据类型或变量占用的字节数。它可以计算任意数据类型(包括基本类型、自定义结构体、数组等)的大小。例如&…

如何使用博达网站群管理平台的树状导航

1 介绍 由于网站建设需要,需在首页的左边竖栏部分使用树状导航。我又过了一遍《网站群管理平台用户手册》,没发现如何在网站的首页设置树状导航组件。昨天,我之所以在创建树状导航上不知所措,是因为平台本身有一些误导&#xff0…

捷途山海T2 VS 唐DM-i:谁主沉浮?

自从新能源技术涌入汽车界,国内自主品牌便凭借电力驱动实现了跨越式发展。众多卓越车型如雨后春笋般涌现,在消费者市场中与合资品牌形成了激烈竞争,这无疑也增加了消费者选择车辆的难度。面对琳琅满目的优秀车型,消费者很容易陷入…

页面设计任务 个人简介页面

目录 任务要求 任务讲解 源码: 详细讲解 html部分 CSS部分 任务要求 页面结构: 创建一个基本的 HTML 页面,页面标题为“我的个人简介”。页面内容分为以下四个部分: 顶部导航栏: 包含至少三个导航链接,例如:“主页”、“关于…

计算机毕业设计选题推荐-二手房价分析与预测-Python爬虫可视化-算法

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

YOLOv8添加SE注意力机制有效提升检测精度(已跑通)

SE注意力机制概念 SSqueeze-and-Excitation (SE) 注意力机制是一种专注于增强网络模型对不同特征通道的重要性理解的机制。它通过对通道维度上的特征进行动态调整,增强了网络对重要特征的敏感性。 源码 import numpy as np import torch from torch import nn fro…

Ubuntu 22.04 上更换 Node 版本管理器(nvm)的源

在 Ubuntu 22.04 上更换 Node 版本管理器(nvm)的源,可以通过修改 nvm 的配置文件来实现。以下是更换 nvm 源的步骤: 打开终端。 备份原始配置文件(可选,但推荐): mv ~/.nvm/nvm.sh …