「Qt Widget中文示例指南」如何实现一个滑动条(一)

news2024/12/25 19:00:23

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

滑动条示例展示了如何使用Qt中可用的不同类型的滑动条:QSlider, QScrollBar 和 QDial。

Qt提供了三种类似滑动条的小部件:QSlider、QScrollBar和QDial,它们都继承了QAbstractSlider的大部分功能,并且理论上可以在应用程序中相互替换,因为差异只涉及它们的外观和样式。这个例子展示了它们是什么样子的,它们是如何工作的,以及如何通过它们的属性来操纵它们的操作和外观。

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

本示例还演示了如何使用信号和槽来同步两个或多个小部件的操作,以及如何覆盖resizeEvent()来实现响应式布局。

「Qt Widget中文示例指南」如何实现一个滑动条

Sliders(滑动条)示例包含两个类:

  • SlidersGroup是一个自定义小部件,它结合了一个QSlider、一个QScrollBar和一个QDial。
  • Window是组合了QGroupBox 和SlidersGroup的主要小部件,QGroupBox包含几个控件,它们控制类似滑动条控件的操作。

首先我们将回顾 Window 类,然后再看看SlidersGroup类。

Window类定义
class Window : public QWidget
{
Q_OBJECT

public:
Window(QWidget *parent = nullptr);

private:
void createControls(const QString &title);
void resizeEvent(QResizeEvent *e);

SlidersGroup *slidersGroup;

QGroupBox *controlsGroup;
QLabel *minimumLabel;
QLabel *maximumLabel;
QLabel *valueLabel;
QCheckBox *invertedAppearance;
QCheckBox *invertedKeyBindings;
QSpinBox *minimumSpinBox;
QSpinBox *maximumSpinBox;
QSpinBox *valueSpinBox;
QBoxLayout *layout;
};

Window类继承自QWidget,它显示滑块小部件,并允许用户设置它们的最小值、最大值和当前值,并自定义它们的外观、键绑定和方向。我们使用一个私有的createcontrol()函数来创建提供这些控制机制的小部件,并将它们连接到滑块小部件。

Window类实现
Window::Window(QWidget *parent)
: QWidget(parent)
{
slidersGroup = new SlidersGroup(tr("Sliders"));

createControls(tr("Controls"));

在构造函数中,我们首先创建显示滑块小部件的SlidersGroup小部件。使用createcontrol()创建控件小部件,并将它们连接到滑块。

layout = new QBoxLayout(QBoxLayout::LeftToRight);
layout->addWidget(controlsGroup);
layout->addWidget(slidersGroup);
setLayout(layout);

minimumSpinBox->setValue(0);
maximumSpinBox->setValue(20);
valueSpinBox->setValue(5);

setWindowTitle(tr("Sliders"));
}

在初始化最小值、最大值和当前值之前,我们将控制小部件组和滑块放在水平布局中。当前值的初始化将通过我们在valueSpinBox和SlidersGroup小部件之间建立的连接传播到滑块小部件,最小值和最大值通过用createcontrol()创建的连接传播。

void Window::createControls(const QString &title)
{
controlsGroup = new QGroupBox(title);

minimumLabel = new QLabel(tr("Minimum value:"));
maximumLabel = new QLabel(tr("Maximum value:"));
valueLabel = new QLabel(tr("Current value:"));

invertedAppearance = new QCheckBox(tr("Inverted appearance"));
invertedKeyBindings = new QCheckBox(tr("Inverted key bindings"));

在私有的createcontrol()函数中,我们让QGroupBox (controlsGroup)显示控制小部件,组合框可以提供框架、标题和键盘快捷方式,并在其内部显示各种其他小部件,控制小部件组由两个复选框和三个带标签的旋转框组成。

在创建标签之后,我们创建两个复选框,复选框通常用于表示应用程序中可以启用或禁用的特性。当invertedAppearance被启用时,滑块值被反转,下表显示了不同的类似滑块小部件的外观:

「Qt Widget中文示例指南」如何实现一个滑动条

反转垂直QSlider的外观是很常见的,例如控制音量的垂直滑块通常会从下到上(非倒置的外观),而控制屏幕上对象位置的垂直滑块可能会从上到下,因为屏幕坐标是从上到下的。

当invertedKeyBindings选项被启用时(对应于QAbstractSlider::invertedControls 属性),滑块的滚轮和键事件被反转。正常的键绑定意味着向上滚动鼠标滚轮或使用像page up这样的键会将滑块的当前值增加到最大值,反过来,相同的滚轮和键事件将把值移动到滑块的最小值。如果滑块的外观是颠倒的,这可能很有用:一些用户可能希望键在值上仍然以相同的方式工作,而另一些用户可能希望PageUp在屏幕上表示“向上”。

注意,对于水平和垂直滚动条,默认情况下键绑定是反向的:PageDown增加当前值,而PageUp减少当前值。

minimumSpinBox = new QSpinBox;
minimumSpinBox->setRange(-100, 100);
minimumSpinBox->setSingleStep(1);

maximumSpinBox = new QSpinBox;
maximumSpinBox->setRange(-100, 100);
maximumSpinBox->setSingleStep(1);

valueSpinBox = new QSpinBox;
valueSpinBox->setRange(-100, 100);
valueSpinBox->setSingleStep(1);

然后我们创建旋转箱,QSpinBox 允许用户通过单击向上和向下按钮或按键盘上的向上和向下键来选择一个值,以修改当前显示的值,用户也可以手动输入该值。旋转框控制QSlider、QScrollBar和QDial小部件的最小值、最大值和当前值。

connect(slidersGroup, &SlidersGroup::valueChanged,
valueSpinBox, &QSpinBox::setValue);
connect(valueSpinBox, &QSpinBox::valueChanged,
slidersGroup, &SlidersGroup::setValue);
connect(minimumSpinBox, &QSpinBox::valueChanged,
slidersGroup, &SlidersGroup::setMinimum);
connect(maximumSpinBox, &QSpinBox::valueChanged,
slidersGroup, &SlidersGroup::setMaximum);
connect(invertedAppearance, &QCheckBox::toggled,
slidersGroup, &SlidersGroup::invertAppearance);
connect(invertedKeyBindings, &QCheckBox::toggled,
slidersGroup, &SlidersGroup::invertKeyBindings);

QGridLayout *controlsLayout = new QGridLayout;
controlsLayout->addWidget(minimumLabel, 0, 0);
controlsLayout->addWidget(maximumLabel, 1, 0);
controlsLayout->addWidget(valueLabel, 2, 0);
controlsLayout->addWidget(minimumSpinBox, 0, 1);
controlsLayout->addWidget(maximumSpinBox, 1, 1);
controlsLayout->addWidget(valueSpinBox, 2, 1);
controlsLayout->addWidget(invertedAppearance, 0, 2);
controlsLayout->addWidget(invertedKeyBindings, 1, 2);
controlsGroup->setLayout(controlsLayout);

}

然后我们将slidersGroup和valueSpinBox相互连接,这样当其中一个的当前值发生变化时,滑块小部件和控制小部件的操作将同步。valueChanged()信号以新值作为参数发出,setValue()槽将小部件的当前值设置为新值,如果新值与旧值不同,则发出valueChanged()。

我们通过控制部件和滑块部件的信号和槽来同步它们的操作,将每个控件小部件连接到滑块小部件的水平和垂直组,同时将orientationCombo连接到QStackedWidget,以便显示正确的“页面”。最后,我们在controlsGroup组框中的QGridLayout中布局控制小部件。

void Window::resizeEvent(QResizeEvent *)
{
if (width() == 0 || height() == 0)
return;

const double aspectRatio = double(width()) / double(height());

if (aspectRatio < 1.0) {
layout->setDirection(QBoxLayout::TopToBottom);
slidersGroup->setOrientation(Qt::Horizontal);
} else if (aspectRatio > 1.0) {
layout->setDirection(QBoxLayout::LeftToRight);
slidersGroup->setOrientation(Qt::Vertical);
}
}

最后我们从QWidget重写resizeEvent(),避免除以零,否则计算小部件的宽高比。如果窗口具有纵向格式,那么我们设置布局以垂直地组织控制小部件和滑块组,并将滑块设置为水平方向。如果窗口是横向格式,那么我们改变布局,让滑块和控制并排显示,并给滑块一个垂直方向。

篇幅有限未完待续,更多内容敬请期待.......

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

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

相关文章

618在即!「企业商城」作战攻略曝光,解锁电商化采购新模式

“618”购物狂欢大促即将到来&#xff0c;凡是大促&#xff0c;必为商机。 当前&#xff0c;618正在成为拉动品牌销量增长的重要战役&#xff0c;这已经是很多商家的共识。 网上商城交易采购组织形式公开透明、成本低、效率高的优势凸显&#xff0c;逐渐成为各企业采购的主流模…

苹果电脑压缩视频的软件,苹果电脑怎么压缩视频文件大小

在数字时代的浪潮中&#xff0c;视频已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;视频文件的大小也在不断攀升&#xff0c;给存储和传输带来了不小的挑战。因此&#xff0c;视频压缩技术应运而生&#xff0c;成为解决这一问题的关键。本文将详细介绍视频压缩…

Java17 --- redis7缓存双写一致性

一、缓存双写一致性 如果redis中有数据&#xff1a;需要和数据库中的值相同。如果redis中没有数据&#xff1a;数据库中的值要是最新值&#xff0c;且准备回写redis。只读缓存。读写缓存&#xff1a;①、同步直写策略&#xff1a;写数据库后也同步写redis缓存&#xff0c;缓存…

ChatGPT的问题与回复的内容导出(Chorme)

我给出两种方式&#xff0c;第一种方式无使用要求&#xff0c;第二种方式必须安装Chorme 个人更推荐第二种方式 第一种方式&#xff1a;使用chatgpt自带的数据导出 缺点&#xff1a;会将当前未归档的所有聊天记录导出&#xff0c;发送到你的电子邮箱中 第二种方式&#xff1a…

C语言 | Leetcode C语言题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; //单调栈 单调递减 typedef struct {//正常 stackint stack[10000];int stackTop;//辅助 stackint minStack[10000];int minStackTop; } MinStack;MinStack* minStackCreate() {MinStack* newStack (MinStack *) malloc(sizeof(MinS…

【Git】多人协作 -- 详解

一、多人协作&#xff08;1&#xff09; ⽬前&#xff0c;我们所完成的工作如下&#xff1a; 基本完成 Git 的所有本地库的相关操作&#xff0c;git 基本操作&#xff0c;分支理解&#xff0c;版本回退&#xff0c;冲突解决等等。 申请码云账号&#xff0c;将远端信息 clone…

C++通过VS2022使用Conan2.0安装fmt库实现控制台彩色打印

Conan是一个开源的C/C包管理器&#xff0c;用于管理和构建C/C项目的依赖关系。它允许开发人员轻松地集成第三方库、工具和资源到他们的项目中&#xff0c;并管理这些依赖项的版本、构建选项和配置。 Conan官方提供了对应的VS2022扩展插件&#xff0c;通过这个插件再搭配VS2022…

路由控制和策略路由

文章目录 一、路由控制&#xff08;1&#xff09;、前言1.1.1-路由策略 &#xff08;2&#xff09;、正反掩码和通配符1.2.1-通配符 &#xff08;3&#xff09;、ACL1.3.1-ACL步长1.3.2-步长的作用1.3.3-TCP/UDP端口号 实验1:实验2: 二、前缀列表实验1:2.1.1-前缀列表的表达式2…

一平台一张图,撑起危化生产“安全伞”

安全生产是永恒的主题&#xff0c;是一切工作的基础。 风险辨识不到位、特种作业不合规、隐患治理不彻底、应急能力不匹配……如何从消除事故隐患、从根本上解决问题&#xff1f;随着新一代信息技术和安全生产的深度融合&#xff0c;安全生产的管理方式也在发生深刻变化。 提前…

SQL Server入门-SSMS简单使用(2008R2版)-1

环境&#xff1a; win10&#xff0c;SQL Server 2008 R2 参考&#xff1a; SQL Server 新建数据库 - 菜鸟教程 https://www.cainiaoya.com/sqlserver/sql-server-create-db.html 第 2 课&#xff1a;编写 Transact-SQL | Microsoft Learn https://learn.microsoft.com/zh-cn/…

百数私有化本地部署技术解析,附带独家优惠政策

数据驱动的时代&#xff0c;数据安全性对于每个企业来说都至关重要。私有化本地部署作为一种高效的数据管理方式&#xff0c;越来越受到企业的青睐。然而&#xff0c;高昂的部署费用常常让企业望而却步。 作为一家深耕办公领域10年的低代码公司&#xff0c;百数以本地化部署起…

监控局域网电脑屏幕的办法,最简单的三种方法,好用!

在现代企业管理和家庭教育环境中&#xff0c;对局域网内电脑屏幕进行有效监控成为了保障信息安全、提升工作效率和监督行为规范的重要手段。 监控局域网电脑屏幕不仅可以帮助管理者了解员工的工作状态&#xff0c;确保资源的合理使用&#xff0c;还能在一定程度上预防潜在的网…

AI绘画Stable Diffusion 挽救渣图的神器—Loopback Scaler脚本,你值得拥有!

大家好&#xff0c;我是向阳 今天这篇文章就是围绕着开局的这两张原图开始的。 在Stable diffusion甚至当前所有的AI画图工具里面&#xff0c;AI生成内容随机性都是一个很大的问题。 我们经常遇到一张图构图不错但是脸崩了&#xff0c;又或者人物形象不错但是背景画得崩了这…

海南云亿商务咨询有限公司抖店开店怎么样?

在数字化浪潮席卷全球的今天&#xff0c;电商行业日新月异&#xff0c;其中抖音电商以其独特的短视频直播模式&#xff0c;迅速崛起成为电商领域的新贵。海南云亿商务咨询有限公司&#xff0c;作为抖音电商服务的佼佼者&#xff0c;凭借专业的团队和丰富的经验&#xff0c;致力…

人体关键点检测-基于Gradio完成应用开发

前言 本次分享将带领大家从 0 到 1 完成一个人体姿态估计任务&#xff0c;覆盖数据准备、模型训练、推理部署和应用开发的全流程&#xff0c;项目将采用以PaddlePaddle为核心的飞桨深度学习框架进行开发&#xff0c;并总结开发过程中踩过的一些坑&#xff0c;希望能为有类似项…

通过nginx转发后应用偶发502bad gateway

序言 学习了一些东西&#xff0c;如何才是真正自己能用的呢&#xff1f;好像就是看自己的潜意识的反应&#xff0c;例如解决了一个问题&#xff0c;那么下次再碰到类似的问题&#xff0c;能直接下意识的去找到对应的信息&#xff0c;从而解决&#xff0c;而不是和第一次碰到一样…

重生奇迹MU召唤术师简介

出生地&#xff1a;幻术园 性 别&#xff1a;女 擅 长&#xff1a;召唤幻兽、辅助魔法&攻击魔法 转 职&#xff1a;召唤巫师&#xff08;3转&#xff09; 介 绍&#xff1a;从古代开始流传下来的高贵的血缘&#xff0c;为了种族纯正血缘的延续及特殊使用咒术的天赋&…

那些年你用过的iOS开发工具

版权说明 本文转载于《程序员》杂志 2014 年 6 月刊。 前言 从苹果发明 iPhone 起&#xff0c;AppStore 上的一个又一个类似 flappy bird 的一夜暴富的故事刺激着大量开发者加入移动开发大军。随着这些开发者出现的&#xff0c;还有大量方便 iOS 开发者的各种工具。这些工具…

琪朗护眼大路灯推荐入手吗?书客、琪朗、雷士落地灯测评大比拼!

护眼大路灯现在的风越来越大&#xff0c;它是一种能够改善光线质量的工具&#xff0c;通过光源的设计、技术的调校、防眩光的设计等&#xff0c;利用LED全光谱光源的高能效、长寿命光色稳定性的优点&#xff0c;搭载专研的护眼黑科技技术&#xff0c;以及采用防眩光设计&#x…

【vue3|第10期】Vue3中watchEffect详解

日期&#xff1a;2024年6月10日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…