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

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

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

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

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

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

在上文中(点击这里回顾>>),我们主要为大家介绍了Window类定义、Window类实现等,本文将继续介绍SlidersGroup类的定义和实现。

SlidersGroup类定义
cpp 复制代码
class SlidersGroup : public QGroupBox
{
Q_OBJECT

public:
SlidersGroup(const QString &title, QWidget *parent = nullptr);

signals:
void valueChanged(int value);

public slots:
void setValue(int value);
void setMinimum(int value);
void setMaximum(int value);
void invertAppearance(bool invert);
void invertKeyBindings(bool invert);
void setOrientation(Qt::Orientation orientation);

private:
QSlider *slider;
QScrollBar *scrollBar;
QDial *dial;
QBoxLayout *slidersLayout;
};

SlidersGroup类继承自QGroupBox,它提供了一个框架和一个标题,并包含一个QSlider、一个QScrollBar 和一个QDial

我们提供了一个valueChanged()信号和一个公共setValue()槽,其功能与QAbstractSlider和QSpinBox中的相同。此外,我们还实现了其他几个公共槽来设置最小值和最大值,并反转滑块小部件的外观以及键绑定,并设置方向。

SlidersGroup类实现
cpp 复制代码
SlidersGroup::SlidersGroup(const QString &title, QWidget *parent)
: QGroupBox(title, parent)
{
slider = new QSlider;
slider->setFocusPolicy(Qt::StrongFocus);
slider->setTickPosition(QSlider::TicksBothSides);
slider->setTickInterval(10);
slider->setSingleStep(1);

scrollBar = new QScrollBar;
scrollBar->setFocusPolicy(Qt::StrongFocus);

dial = new QDial;
dial->setFocusPolicy(Qt::StrongFocus);

首先我们创建具有适当属性的类似滑块的小部件,我们为每个小部件设置焦点策略。Qt::FocusPolicy是一个枚举类型,它定义了小部件在获取键盘焦点方面可以具有的各种策略,Qt::StrongFocus策略意味着小部件通过tab和click来接受焦点。

cpp 复制代码
connect(slider, &QSlider::valueChanged, scrollBar, &QScrollBar::setValue);
connect(scrollBar, &QScrollBar::valueChanged, dial, &QDial::setValue);
connect(dial, &QDial::valueChanged, slider, &QSlider::setValue);
connect(dial, &QDial::valueChanged, this, &SlidersGroup::valueChanged);

然后我们将这些小部件彼此连接起来,这样当其中一个小部件的当前值发生变化时,它们将保持同步。

将dial的valueChanged()信号连接到SlidersGroup的valueChanged()信号,来将更改的值通知应用程序中的其他小部件(即控件小部件)。

cpp 复制代码
slidersLayout = new QBoxLayout(QBoxLayout::LeftToRight);
slidersLayout->addWidget(slider);
slidersLayout->addWidget(scrollBar);
slidersLayout->addWidget(dial);
setLayout(slidersLayout);
}

最后为组框内的滑块小部件创建布局,从滑块的水平排列开始。

cpp 复制代码
void SlidersGroup::setValue(int value)
{
slider->setValue(value);
}

setValue()槽设置QSlider的值,我们不需要在QScrollBar和QDial小部件上显式地调用setValue(),因为QSlider将在其值发生变化时发出valueChanged()信号,从而触发多米诺骨牌效应。

cpp 复制代码
void SlidersGroup::setMinimum(int value)
{
slider->setMinimum(value);
scrollBar->setMinimum(value);
dial->setMinimum(value);
}

void SlidersGroup::setMaximum(int value)
{
slider->setMaximum(value);
scrollBar->setMaximum(value);
dial->setMaximum(value);
}

setMinimum()和setMaximum()槽被Window类用来设置QSlider、QScrollBar和QDial小部件的范围。

cpp 复制代码
void SlidersGroup::invertAppearance(bool invert)
{
slider->setInvertedAppearance(invert);
scrollBar->setInvertedAppearance(invert);
dial->setInvertedAppearance(invert);
}

void SlidersGroup::invertKeyBindings(bool invert)
{
slider->setInvertedControls(invert);
scrollBar->setInvertedControls(invert);
dial->setInvertedControls(invert);
}

invertAppearance()和invertKeyBindings()插槽控制子部件的invertedAppearanceinvertedControls属性。

cpp 复制代码
void SlidersGroup::setOrientation(Qt::Orientation orientation)
{
slidersLayout->setDirection(orientation == Qt::Horizontal
? QBoxLayout::TopToBottom
: QBoxLayout::LeftToRight);
scrollBar->setOrientation(orientation);
slider->setOrientation(orientation);
}

setOrientation()插槽控制布局的方向和滑块的方向,在水平组中,滑块具有水平方向,并且彼此堆叠在一起。在垂直组中,滑块具有垂直方向,并且彼此相邻布局。

相关推荐
Molesidy3 小时前
【VSCode】【Clangd】Win下的基于LLVM/Clangd+Clangd插件+MINGW+CMake的VSCode配置C/C++开发环境的详细教程
c++·ide·vscode·clangd·llvm
Mr_WangAndy4 小时前
C++_chapter13_C++并发与多线程_多线程概念,死锁,unique_lock(),lock_guard()使用
c++·lock·死锁·并发与多线程·unlock·lock_guard·unique_lock
小欣加油4 小时前
leetcode 946 验证栈序列
c++·算法·leetcode·职场和发展
神仙别闹4 小时前
基于QT(C++) 实现哈夫曼压缩(多线程)
java·c++·qt
小陈又菜5 小时前
【QT学习之路】网络通信新次元!Qt TCP双侠:Server监听瞬息,Socket连接万变
qt·网络协议·tcp/ip·socket
无敌最俊朗@5 小时前
C++ 并发与同步速查笔记(整理版)
开发语言·c++·算法
神仙别闹6 小时前
基于 C++和 Python 实现计算机视觉
c++·python·计算机视觉
眠りたいです6 小时前
基于脚手架微服务的视频点播系统-客户端业务逻辑处理部分(三)-客户端主体部分完结
c++·微服务·云原生·架构·json·restful·qt6.7
Elnaij6 小时前
从C++开始的编程生活(12)——vector简单介绍和迭代器
开发语言·c++
GISer_Jing7 小时前
OSG底层从Texture读取Image实现:readImageFromCurrentTexture
前端·c++·3d