【三十四】【QT开发应用】音量图标以及滑动条,没有代码补全的小技巧
效果展示
- 鼠标位于音量图标区域内,显示出滑动条。鼠标移出音量图标区域内滑动条隐藏。
- 鼠标点击音量图标,如果此时音量为0,音量变成50,如果此时音量不为零,音量变为0。
CVolumeButton.h 音量图标头文件
#pragma once
#include <QtWidgets>
#include "CVolumeSliderDialog.h"class CVolumeButton :public QPushButton {Q_OBJECT
public:CVolumeButton(QWidget* p = nullptr);~CVolumeButton();protected:void enterEvent(QEnterEvent* event) override;void timerEvent(QTimerEvent* event) override;void mousePressEvent(QMouseEvent* event) override;private:CVolumeSliderDialog* m_pVolumeSliderDlg = nullptr;int m_timerId = -1;bool m_isMute = false;
};
#include <QtWidgets>
是 Qt 库中用于引入所有与图形用户界面(GUI)相关控件的头文件。可以理解为是一个模块头文件,用这一个头文件就可以包含许多其他的头文件,和C++中的万能头文件#include<bits/stdc++>
有异曲同工之妙。通过#include <QtWidgets>
,你可以一次性引入所有常用的 GUI 控件,而无需单独引入每个控件的头文件。它包含了大部分用于创建桌面应用程序的常见控件,比如 QMainWindow、QDialog、QPushButton 等。- 重载了这三个函数事件,
enterEvent
是进入事件,也就是说当鼠标进入到空间区域内会触发的事件.timerEvent
是定时器事件,设置完毕定时器之后,每过一段事件就会触发一遍定时器内的函数逻辑.mousePressEvent
是鼠标按下事件,当鼠标按下按键之后,会触发的事件.void enterEvent(QEnterEvent* event) override;void timerEvent(QTimerEvent* event) override;void mousePressEvent(QMouseEvent* event) override;
CVolumeSliderDialog
是滑动条类,m_timerId
是定时器的ID,创建出一个定时器之后会返回一个定时器ID,m_isMute
用来判断音量是否不为0,也就是说判断是否有音量.CVolumeSliderDialog* m_pVolumeSliderDlg = nullptr;int m_timerId = -1;bool m_isMute = false;
CVolumeButton.cpp 音量图标源文件
#include "CVolumeButton.h"CVolumeButton::CVolumeButton(QWidget* p):QPushButton(p) {this->setFixedSize(32, 32);setStyleSheet(R"(
QPushButton{
background-image:url(:/widget/resources/audio_open.svg);
border:none;
}
QPushButton:hover{
background-image:url(:/widget/resources/audio_open_hover.svg);
}
QPushButton:pressed{
background-image:url(:/widget/resources/audio_open.svg);
}
)");}CVolumeButton::~CVolumeButton() {}void CVolumeButton::enterEvent(QEnterEvent* event) {qDebug() << "1111111";if (m_pVolumeSliderDlg == nullptr) m_pVolumeSliderDlg = new CVolumeSliderDialog(this);QPoint p1 = this->mapToGlobal(QPoint(0, 0));//局部坐标(0, 0)转换为全局坐标p1QRect rect1 = this->rect();//获取当前按钮的矩形区域QRect rect2 = m_pVolumeSliderDlg->rect();//获取滑动条的矩形区域int x = p1.x() + (rect1.width() - rect2.width()) / 2;int y = p1.y() - rect2.height();m_pVolumeSliderDlg->move(x, y);//将滑动条移动到(x,y)位置,全局坐标(x,y)m_pVolumeSliderDlg->show();//显示滑动条m_timerId = startTimer(250);//启动定时器,返回定时器ID,定时器间隔250ms触发一次
}void CVolumeButton::timerEvent(QTimerEvent* event) {if ((m_pVolumeSliderDlg != nullptr) && (m_pVolumeSliderDlg->isVisible())) {QPoint p1 = QCursor::pos();//获取鼠标全局坐标if (m_pVolumeSliderDlg) {QRect rect1 = this->rect();//获取局部矩形区域QRect rect2 = m_pVolumeSliderDlg->geometry();//获取全局矩形区域QPoint p2 = this->mapToGlobal(QPoint(0, 0));QRect arec(rect2.left(), rect2.top(), rect2.width(), p2.y() + rect1.height() - rect2.top());//定义滑动条显示的情况下鼠标存在的区域if (!arec.contains(p1))//如果arec不包含p1,隐藏滑动条m_pVolumeSliderDlg->hide();}}
}void CVolumeButton::mousePressEvent(QMouseEvent* event) {if (m_pVolumeSliderDlg->isZeroValue()) {//判断滑动条值是否为0m_isMute = false;//为零表示不存在音量值} else {m_isMute = true;//否则表示存在音量值}if (event->button() == Qt::LeftButton) {//如果左键点击按钮if (m_isMute) {//如果有音量if (m_pVolumeSliderDlg) {m_pVolumeSliderDlg->setSliderValue(0);//音量置0}} else {if (m_pVolumeSliderDlg) {m_pVolumeSliderDlg->setSliderValue(50);//否则置50}}}
}
enterEvent
进入事件,当鼠标进入到音量图标控件区域内就会触发的事件函数.
我们希望触发的事件是显示出滑动条,并且滑动条显示的位置在音量控件的正上方,水平居中对齐.因此我们需要设置滑动条的位置,通过使用move(x,y)函数操作使滑动条移动到指定的位置.
timerEvent
定时器事件,设置定时器时间,定时器会每间隔time时间就运行一遍函数.
rect和geometry的区别
rect()
- 返回值:控件自身的局部坐标系中的矩形区域,仅代表控件本身的尺寸(宽度和高度),而不包含控件相对于屏幕或父窗口的位置。
x()
和y()
均为 0,因为这个矩形是以控件的左上角为原点的局部坐标。width()
和height()
分别表示控件的宽度和高度。- 使用场景:当你只关心控件的尺寸(宽度和高度),而不关心它相对于父控件或屏幕的位置时,使用
rect()
。
geometry()
- 返回值:控件在父控件或屏幕上的绝对矩形区域,即控件的相对位置(x 和 y 坐标)以及它的尺寸(宽度和高度)。
x()
和y()
表示控件相对于父控件或窗口的左上角位置。width()
和height()
与rect()
返回的尺寸相同,表示控件的宽度和高度。- 使用场景:当你需要知道控件在父控件或屏幕中的具体位置(包括坐标和尺寸)时,使用
geometry()
。
区别总结:
rect()
:只提供控件的宽度和高度,左上角坐标总是 (0, 0)。geometry()
:不仅提供控件的宽度和高度,还包含控件相对于父控件或屏幕的左上角位置坐标 (x, y)。
- 局部坐标转化为全局坐标
QPoint p1 = this->mapToGlobal(QPoint(0, 0));
- 设置控件左上角坐标
m_pVolumeSliderDlg->move(x, y);
- 获取鼠标全局坐标
QPoint p1 = QCursor::pos();
CVolumeSliderDialog.h 滑动条头文件
#pragma once
#include <QtWidgets>class CVolumeSliderDialog :public QWidget {Q_OBJECT
public:CVolumeSliderDialog(QWidget* p = nullptr);~CVolumeSliderDialog();void setSliderValue(int value) {m_pSlider->setValue(value);}bool isZeroValue() {return m_pSlider->value() == 0;}private:QSlider* m_pSlider = nullptr;
};
setSliderValue
函数内置控制滑动条的函数,我们可以通过QSlider
直接控制滑动条的值,为啥还需要内置一个函数去控制?因为我们运用CVolumeSliderDialog
类无法控制私有的变量,所以需要共有的函数去控制isZeroValue
函数内置判断滑动条值是否为0.
CVolumeSliderDialog.cpp
#include "CVolumeSliderDialog.h"CVolumeSliderDialog::CVolumeSliderDialog(QWidget* p):QWidget(p) {this->setFixedSize(40, 120);QVBoxLayout* pVLay = new QVBoxLayout(this);m_pSlider = new QSlider(this);m_pSlider->setOrientation(Qt::Vertical);pVLay->addWidget(m_pSlider);setStyleSheet(R"(
QDialog{
background-color:rgba(54,54,54,0.5);
}
)");setWindowFlags(Qt::ToolTip);}
CVolumeSliderDialog::~CVolumeSliderDialog() {}
-
setWindowFlags(Qt::ToolTip);
这是一个 WindowType 标志,表示窗口将被设置为类似工具提示(ToolTip)的窗口。- 特点
- 没有标题栏,也不会显示在任务栏或窗口列表中。
- 无法通过点击或拖动对其进行交互。
- 通常用于显示一些临时性的信息,比如提示文本、悬停提示等。
- 特点
-
m_pSlider->setOrientation(Qt::Vertical);
这行代码用于将滑块控件 (QSlider 或类似的控件) 的方向设置为垂直方向 (Qt::Vertical)。
widget.cpp
#include "widget.h"
#include "QtWidgets"
#include "CVolumeButton.h"
#include "CVolumeSliderDialog.h"widget::widget(QWidget* parent): QWidget(parent) {ui.setupUi(this);resize(800, 600);QHBoxLayout* pHLay = new QHBoxLayout(this);CVolumeButton* pVolumeButton = new CVolumeButton(this);//CVolumeSliderDialog* ptemp = new CVolumeSliderDialog(this);pHLay->addWidget(pVolumeButton);}widget::~widget() {}
没有代码提示怎么办?
当你发现某一个关键字没有代码提示的时候,Ctrl+左键进入到目标文件中.
以QHBoxLayout关键字为例,进入之后复制文件夹的完整路径.
点开番茄助手添加复制的完整路径点击确定.
然后启动窗口,重新启动该程序,再次输入就会有代码补全了.
结尾
最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!
相关文章:

【三十四】【QT开发应用】音量图标以及滑动条,没有代码补全的小技巧
效果展示 鼠标位于音量图标区域内,显示出滑动条。鼠标移出音量图标区域内滑动条隐藏。鼠标点击音量图标,如果此时音量为0,音量变成50,如果此时音量不为零,音量变为0。 CVolumeButton.h 音量图标头文件 #pragma once …...
Android修改第三方应用相机方向
以下修改基于Android7.1 diff --git a/frameworks/base/core/java/android/hardware/Camera.java b/frameworks/base/core/java/android/hardware/Camera.java index 8c7434b..7201481 100755 --- a/frameworks/base/core/java/android/hardware/Camera.java b/frameworks/ba…...
Python 读取文件汇总
readline和readlines的区别 使用 open()读取文件时,readline是读取文件的一行;而readlines是加载全部文档,以list形式保存每一行内容。 使用with避免资源泄露 with语句不仅限于open()函数,任何实现了上下文管理协议的对象都可以…...

云原生:一张图了解devops 中CI/CD
一个典型的云原生应用的开发和部署过程,其中涉及到的主要工具有 Git、Docker、Jenkins/CircleCI、Ansible、Kubernetes 等。以下是每个步骤的简要说明: 开发人员(Developers)使用 Git 进行版本控制,他们将代码推送到 G…...

无人机之自组网通信技术篇
无人机的自组网通信技术是一种利用无人机作为节点,通过无线通信技术实现节点间自主组网、动态路由和数据传输的技术。 一、技术原理与特点 技术原理:无人机自组网技术基于自组织网络(Ad-Hoc Network)的原理,通过无线…...
【WebLogic】Oracle发布2024年第四季度中间件安全公告
Oracle于美国时间2024年10月15日发布了 WebLogic 12c(12.2.1.4.0)和14c(14.1.1.0.0)两个大版本2024年第4季度的安全公告,涉及漏洞ID共计 6 个,包含2个高危漏洞 2 个,4个中危漏洞,其中…...
Java集合(3:Set和Map)
文章目录 Set概述哈希值HashSet去重原理LinkedHashSetTreeSet自定义排序规则 Map概述Map的基本方法Map集合的获取功能哈希表HashMap底层源码 特点注意 Set 概述 Set集合也是一个接口,继承自Collection,与List类似,都需要通过实现类来进行操…...

【Golang】Gin框架中如何定义路由
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

CPU内存飙升
CPU 飙升介绍 CPU 飙升是指中央处理器(CPU)的使用率在短时间内急剧上升,达到一个较高的水平。正常情况下,CPU 会根据系统和应用程序的需求合理分配资源,使用率会在一定范围内波动。但当 CPU 飙升时,可能会导…...

【Java】LinkedList实现类的使用
LinkedList实现类的使用 package com.star.test04;import java.util.Iterator;import java.util.LinkedList;/** * author : Starshine */public class Test { //这是main方法,程序的入口 public static void main(String[] args) { /* LinkedL…...

创建人物状态栏
接下来,我们来尝试制作一下我们的UI,我们会学习unity基本的UI系统 ************************************************************************************************************** 我们要先安装一个好用的插件到我们的unity当中,帮助…...
django5入门【01】环境配置
注意: ⭐前提:安装了annaconda(python版本管理工具),如果没有安装,强烈建议安装一下!!!操作: 前言: 这里新创建一个名为“python_3.11_start_dja…...

1000集《楼兰》系列短剧开机仪式在疆举行,开启全球传播新篇章
2024年10月18日,光明媚,秋风送爽。 在这个收获的季节里,倍受期待的楼兰系列短剧《楼兰之天女归来》和《楼兰之时空秘宝》在新疆吐鲁番东方红卓览文化博物馆举行了隆重的开机仪式,正式拉开了摄制的序幕。 1000集《楼兰》系列短剧…...

【景观生态学实验】实验五 景观生态脆弱性评价
实验目的 1.学习层次分析模型思路,对丹江口库区2000年景观生态脆弱性评价建模:通过实验课的学习,深入理解层次分析(Analytic Hierarchy Process,AHP)理论与模型,了解其在决策问题中的应用&…...

ChatGPT 现已登陆 Windows 平台
今天,OpenAI 宣布其人工智能聊天机器人平台 ChatGPT 已开始预览专用 Windows 应用程序。OpenAI 表示,该应用目前仅适用于 ChatGPT Plus、Team、Enterprise 和 Edu 用户,是一个早期版本,将在今年晚些时候推出"完整体验"。…...

和鲸社区数据科学实训季,西安交通大学圆满收官,西安,后会有期!
和鲸社区数据科学实训季活动已走进数十家高校,在西安的收官之站,落定西安交通大学管理学院,为本次西安之旅画上了圆满的句号。 和鲸社区 2024秋 数据科学实训季以“帮助同学积累真实场景项目经验”为出发点,提供 60 个数据科学实践…...
工作使用篇:如何在centos系统中安装anaconda
在CentOS 7上安装Anaconda的步骤如下: 1. 下载Anaconda 首先,你需要下载Anaconda的安装脚本。可以使用wget命令从Anaconda的官网获取最新版本的安装脚本。打开终端并运行以下命令: wget https://repo.anaconda.com/archive/Anaconda3-2024…...

qt creator 转 visual stdio 项目调试
因果 大家在使用qt creator调试程序时,会出现未知错误,比如下图,直接release运行就没有问题。由于调试复杂程序,使用qt creator都感觉不如vs,会报未知中断。 所以有了从qt creator转换到 visual stdio来调试的想法。…...

django5入门【02】创建新的django程序
注意: ⭐前提:已经安装了python以及django所依赖的包1、通过django-admin管理工具在命令行创建Django应用程序,创建命令如下: django-admin startproject ProjectName❓ 疑问:除了使用命令行创建django程序外&#x…...
乐趣无限,十个让你沉浸的“摸鱼”网站
在繁忙的生活中,我们总需要一些摸鱼时刻,来为紧绷的神经松绑。无论是工作间隙的小憩,还是下班后的放松,适当的摸鱼不仅能提升效率,还能让生活充满乐趣。今天,我为大家推荐几个绝对能让你乐在其中的网站&…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...