【三十四】【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…...

乐趣无限,十个让你沉浸的“摸鱼”网站
在繁忙的生活中,我们总需要一些摸鱼时刻,来为紧绷的神经松绑。无论是工作间隙的小憩,还是下班后的放松,适当的摸鱼不仅能提升效率,还能让生活充满乐趣。今天,我为大家推荐几个绝对能让你乐在其中的网站&…...

ubuntu22.04 桌面系统怎么搭建一个esp-idf的项目,搭建开发环境
详细介绍如何在 Ubuntu 22.04 桌面系统上搭建 ESP-IDF 的开发环境,并创建一个 ESP-IDF 项目。以下内容将涵盖从环境准备到项目创建和编译的所有步骤。 目录 环境准备 1.1 更新系统1.2 安装必要的工具和依赖项 安装 ESP-IDF 2.1 克隆 ESP-IDF 仓库2.2 运行安装脚本 …...

iOS Swift逆向——deMangle过程中的偏移计算
碰到好多函数最开始都会调用这个函数,xref了一下,发现有上万个xref。 __int64 __fastcall sub_1000B6ED0(__int64 *a1) {__int64 result; // x0result *a1;if ( result < 0 ){result swift_getTypeByMangledNameInContext((char *)a1 (int)result…...

国产大模型基础能力大比拼 - 计数:通义千文 vs 文心一言 vs 智谱 vs 讯飞-正经应用场景的 LLM 逻辑测试
在大语言模型(LLM)不断涌现的时代,如何评估这些国产大模型的逻辑推理能力,尤其是在处理基础计数问题上的表现,成为了一个备受关注的话题。随着越来越多的国产大模型进入市场,比较它们在不同任务中的表现尤为…...

YOLO11改进 | 注意力机制 | 正确的 Self-Attention 与 CNN 融合范式,性能速度全面提升【独家创新】
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 卷积和自注意力是两种强大的表征学习技术…...

0基础学java之Day11
二维数组 静态二位数组 理解:二维数组中包含了多个一维数组 声明: 数据类型 变量名;--推荐 数据类型 变量名; //静态初始化1//String[][] names new String[][]{{"小红","小绿","小蓝"},{"小黄","小紫…...

python主流框架Django:ORM框架关联查询与管理器
目录 注意 使用前要调用之前的模型类 F对象 Q对象 聚合函数 排序 关联查询(连表查询) 修改 删除 查询集 QuerySet 注意 使用前要调用之前的模型类 F对象 之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用 "F对象&quo…...

如何有效维护您的WordPress在线商店内容:提高客户参与度与转化率的实用技巧
在电子商务领域,内容为王。新鲜、相关且有吸引力的内容能显著提升客户参与度和转化率。本文将探讨如何有效更新和维护您的在线商店内容,确保客户始终获得最佳体验。 定期更新产品信息 产品描述 产品描述是吸引客户和促成销售的关键。定期检查并更新产…...

【Java】认识异常
1.异常概念与体系结构 1.1异常的概念 在我们日常开发中,代码都是尽可能完善,但是难免会出现一些奇奇怪怪的问题。而这些奇奇怪怪的问题可能很难通过代码去控制,比如格式不对会报错,网络不好也会报错等。 在Java中,将…...

20 Shell Script输入与输出
标出输入、标准输出、错误输出 一、程序的基本三个IO流 一)文件描述符 任何程序在Linux系统中都有3个基本的文件描述符 比如: cd/proc/$$/fd 进入当前shell程序对于内核在文件系统的映射目录中: [rootlocalhost ~]# cd /proc/$$/fd [rootlocalhos…...

HCIP-HarmonyOS Application Developer 习题(十六)
(判断)1、HiLink通过分布式软总线的方式连接所有设备,强能力设备可对弱能力设备进行设备虚拟化,将弱设备当做本机设备直接调用。 答案:错误 分析:HiLink 主要针对的是应用开发者与第三方设备开发者…...