QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等
QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等
- 框架搭建
- UI设计
- mp3.h
- mp3.cpp
- 隐藏窗口标题 最大化 最小化 关闭
框架搭建
.pro添加
# 网络 添加多媒体 数据库
QT += network multimedia sql
添加头文件
#include <QWidget>
#include <QNetworkRequest> //HTTP的URL请求管理类
#include <QNetworkAccessManager> //网络入口
#include <QNetworkReply> //网络应答
#include <QEventLoop> //网络请求
#include <QJsonArray> //解析数组
#include <QJsonObject> //解析对象
#include <QMediaPlayer> //媒体播放
#include <QMediaPlaylist> //媒体播放列表
#include <QSqlDatabase> //数据库
#include <QSqlQuery> //数据库查询
#include <QSqlQueryModel> //查询模式
#include <QSqlError> //数据库报错
#include <QMessageBox> //弹出信息框
#include <QTime> //hh:mm:ss
#include <math.h> //数学
#include <QDebug>
#include <QMoveEvent> //移动事件
#include <QScreen> //屏幕
//代码中引入头文件
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))//qt当前版本>=qt5
#include <QtWidgets>
#endif
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))//qt当前版本>=qt6
#include <QtCore5Compat>
#endif//.默认Qt6开启了高分屏支持,界面会变得很大,甚至字体发虚,很多人会不习惯,
//因为这种模式如果程序很多坐标计算没有采用devicePixelRatio进行运算的话,
//100%会出现奇奇怪怪的问题,因为坐标不准确了。要取消这种效果可以设置高分屏缩放因子。
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Floor);
#endif#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))std::sort(ipv4s.begin(), ipv4s.end());
#endif
添加资源文件夹

UI设计


按钮风格
QPushButton
QPushButton{
border-radius:0px;
background-repeat:no-repeat;
border:none;
background-position:canter canter;
}
QPushButton:hover
{background-color: rgba(230, 0, 0, 5);
}
color: rgb(255, 255, 255);/*字体颜色白色*/
background-color: rgba(255, 255, 255,50);/*背景色 透明度50*/
font: 75 12pt "Arial";
QLineEdit
color: rgb(255, 255, 255);/*字体颜色白色*/
background-color: rgba(255, 255, 255,50);/*背景色 透明度50*/
font: 75 12pt "Arial";
border:2px solid;
border-color: rgb(0, 255, 0);
mp3.h
#ifndef MP3_H
#define MP3_H#include <QWidget>
#include <QNetworkRequest> //HTTP的URL请求管理类
#include <QNetworkAccessManager> //网络入口
#include <QNetworkReply> //网络应答
#include <QEventLoop> //网络请求
#include <QJsonArray> //解析数组
#include <QJsonObject> //解析对象
#include <QMediaPlayer> //媒体播放
#include <QMediaPlaylist> //媒体播放列表
#include <QSqlDatabase> //数据库
#include <QSqlQuery> //数据库查询
#include <QSqlQueryModel> //查询模式
#include <QSqlError> //数据库报错
#include <QMessageBox> //弹出信息框
#include <QTime> //hh:mm:ss
#include <math.h> //数学
#include <QDebug>
#include <QMoveEvent> //移动事件
#include <QScreen> //屏幕
//代码中引入头文件
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))//qt当前版本>=qt5
#include <QtWidgets>
#endif
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))//qt当前版本>=qt6
#include <QtCore5Compat>
#endif//.默认Qt6开启了高分屏支持,界面会变得很大,甚至字体发虚,很多人会不习惯,因为这种模式如果程序很多坐标计算没有采用devicePixelRatio进行运算的话,
//100%会出现奇奇怪怪的问题,因为坐标不准确了。要取消这种效果可以设置高分屏缩放因子。
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Floor);
#endif#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))std::sort(ipv4s.begin(), ipv4s.end());
#endifQT_BEGIN_NAMESPACE
namespace Ui { class MP3; }
QT_END_NAMESPACEclass MP3 : public QWidget
{Q_OBJECTpublic:MP3(QWidget *parent = nullptr);~MP3();void paintEvent(QPaintEvent *event);private slots:void on_PB_close_clicked();void on_PB_Function_clicked();private:Ui::MP3 *ui;//音乐下载播放void DownloadPlayer(QString id, QString hash);//访问httpvoid DashJsonAnalysis(QByteArray json);//搜索音乐数据信息的json解析 解析出真正的音乐文件和歌曲QString MusicJsonAnalysis(QByteArray musicJson);//获取qt版本void GetQtVersion();//获取当前屏幕尺寸区域QRect getScreenRect(bool available);int getScreenIndex();protected:void mouseMoveEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void mousePressEvent(QMouseEvent *event);
private://定义坐标QPoint m_mousePoint;QPoint movepress;bool isMousePress;};
#endif // MP3_H
mp3.cpp
只是实现了鼠标窗口移动事件
#include "mp3.h"
#include "ui_mp3.h"
#include <QPainter>MP3::MP3(QWidget *parent): QWidget(parent), ui(new Ui::MP3)
{ui->setupUi(this);//固定窗口大小 宽 高this->setFixedSize(this->geometry().size());//隐藏窗口标题/*生成一个无边界的窗口。用户不能通过窗口系统移动或调整无边界窗口的大小。* 在x11上,标志的结果取决于窗口管理器和它理解主题和/或网络提示的能力。* 大多数现有的现代窗口管理器都可以处理这个问题。*/this->setWindowFlag(Qt::FramelessWindowHint);
}MP3::~MP3()
{delete ui;
}//画主题背景
void MP3::paintEvent(QPaintEvent *event)
{QPainter painter(this);//画家要操作的部件painter.drawPixmap(0,0,QPixmap(":/Images/2041960.jpg"));
}//关闭当前窗口
void MP3::on_PB_close_clicked()
{//this->close();qApp->quit();
}void MP3::DownloadPlayer(QString id, QString hash)
{}void MP3::DashJsonAnalysis(QByteArray json)
{}QString MP3::MusicJsonAnalysis(QByteArray musicJson)
{}void MP3::GetQtVersion()
{qDebug()<<"qt当前版本 = "<<QT_VERSION<<"qt 6检查版本 = "<<QT_VERSION_CHECK(6,0,0);
}void MP3::mouseMoveEvent(QMouseEvent *event)
{if(isMousePress){QPoint movePos = event->globalPos(); //当前鼠标移动坐标qDebug()<<" movePos = "<<event->globalPos();this->move(movePos - m_mousePoint);//鼠标当前移动坐标-原始坐标 = 第二个位置}
}void MP3::mouseReleaseEvent(QMouseEvent *event)
{Q_UNUSED(event); //不使用isMousePress = false;//鼠标松开
}void MP3::mousePressEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton)isMousePress = true;//鼠标按压//窗口移动距离m_mousePoint = event->globalPos() - this->pos(); //当前鼠标移动坐标-当前窗口坐标(默认固定不变)= 第一个位置qDebug()<<" globalPos = "<<event->globalPos();qDebug()<<" this->pos = "<<this->pos(); //窗口当前坐标}
//===========================================================================
//功能页
void MP3::on_PB_Function_clicked()
{GetQtVersion();getScreenRect(true);
}//获取当前屏幕索引
int MP3::getScreenIndex()
{//需要对多个屏幕进行处理int screenIndex = 0;
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))int screenCount = qApp->screens().count();qDebug()<<"screenCount = "<<screenCount;
#elseint screenCount = qApp->desktop()->screenCount();
#endifif (screenCount > 1) {//找到当前鼠标所在屏幕QPoint pos = QCursor::pos();qDebug()<<"pos = "<<pos;for (int i = 0; i < screenCount; ++i) {
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))if (qApp->screens().at(i)->geometry().contains(pos)) {
#elseif (qApp->desktop()->screenGeometry(i).contains(pos)) {
#endifscreenIndex = i;break;}}}qDebug()<<"screenIndex = "<<screenIndex;return screenIndex;
}//获取当前屏幕尺寸区域
QRect MP3::getScreenRect(bool available)
{QRect rect;int screenIndex = getScreenIndex();if (available) {
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))rect = qApp->screens().at(screenIndex)->availableGeometry();
#elserect = qApp->desktop()->availableGeometry(screenIndex);
#endif} else {
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))rect = qApp->screens().at(screenIndex)->geometry();
#elserect = qApp->desktop()->screenGeometry(screenIndex);
#endif}qDebug()<<"rect = "<<rect;return rect;
}
隐藏窗口标题 最大化 最小化 关闭
生成一个无边界的窗口。用户不能通过窗口系统移动或调整无边界窗口的大小。
在x11上,标志的结果取决于窗口管理器和它理解主题和/或网络提示的能力。
大多数现有的现代窗口管理器都可以处理这个问题。
this->setWindowFlag(Qt::FramelessWindowHint);
相关文章:
QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等
QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等框架搭建UI设计mp3.hmp3.cpp隐藏窗口标题 最大化 最小化 关闭框架搭建 .pro添加 # 网络 添加多媒体 数据库 QT network multimedia sql添加头…...
硬件学习 软件Cadence day04 PCB 封装绘制
1.文章内容: 1. 贴片式电容 PCB 封装绘制 (型号 c0603 ) 2. 贴片式电阻 PCB 封装绘制 (型号 r0603 ) 3. 安规式电容 PCB 封装绘制 (这个就是 有一个电容,插入一个搞好的孔里面 …...
【Java】yield()和join()区别
一、java 线程调度的背景 java虚拟机要求在多线程中实现 preemptive和priority-based调度,这意味着java中每一个线程被分配了特定的优先级,正整数在定义好的范围内不断减。优先级可以通过开发者改变但是java虚拟机从不改变线程的优先级,即使…...
【MySQL】Java连接MySQL数据库(封装版只需会MySQL)
一、准备普通项目如果创建的是普通的Java项目,我们需要去maven仓库下载jdbc驱动包然导入项目中就能使用,具体步骤详见MySQL数据库之Java中如何使用数据库【JDBC编程】maven项目如果创建的项目是maven项目,我们只需在pom.xml文件里引入一组依赖…...
【java基础】运算符
运算符 operator 运算符优先级 Operators 操作员Precedence 优先级postfix 后缀expr expr--unary 一元的expr --expr expr -expr ~ !multiplicative 〔数〕乘法的 / %additive 添加剂 -shift 移动<< >> >>>relational 关系的< > < > insta…...
带噪学习-概述
在实际应用的时候,我们的样本不会是完全干净的,即存在噪声样本。那使用存在噪声的样本时,我们如何更有效的进行模型学习呢?Label Dependent Nose样本选择(Sample Selection)第一种很直接的想法,…...
Scratch少儿编程案例-多彩打地鼠
专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...
为什么拔掉计算机网线还能ping通127.0.0.1?
前言 当我们在计算机上拔掉网线之后,发现我们仍然可以使用ping命令来ping通本机的IP地址127.0.0.1,这让很多人感到困惑,认为拔掉网线后计算机就无法与外界通信了,为什么还能ping通本机的IP地址呢? 本文的目的是通过对…...
Android kotlin 内、外部存储根目录及测试(可以实现仿微信未读消息数提示数字)
<<返回总目录 文章目录 一、内部存储与外部存储三、外部存储的写读测试(可以实现仿微信未读消息数提示数字)一、内部存储与外部存储 所有Android设备都有两个文件存储区域:内部存储空间(internal Storage)和外部存储空间(external Storage)。所以,Android系统从逻…...
Android 7.0 OTA升级(高通)
文章目录1. Full OTA 方式升级介绍1.1 Full OTA 制作第一步:生成 msm89xx-target_files-eng.XXX.zip1.2 Full OTA 制作第二步:Modem 等非 HLOS 加入升级包的方法1.3 Full OTA 制作第三步:生成 update.zip 升级包2. Incremental OTA 方式升级介…...
工作负载之DeployMent
DeployMent 无状态工作负载(Deployment):即kubernetes中的“Deployment”,无状态工作负载支持弹性伸缩与滚动升级,适用于实例完全独立、功能相同的场景,如:nginx、wordpress等。 也是公司中应…...
淘宝tmall页面数据获取,API接口对接程序
item_get-获得淘宝商品详情请求参数请求参数:num_iid652874751412&is_promotion1参数说明:num_iid:淘宝商品IDis_promotion:是否获取取促销价响应参数Version: Date:2022-04-04名称类型必须示例值描述itemitem[]1宝贝详情数据num_iidBigint152081325…...
基于粒子群优化算法的电动汽车充放电V2G研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
java并发编程原理2 (AQS, ReentrantLock,线程池)
一、AQS: 1.1 AQS是什么? AQS就是一个抽象队列同步器,abstract queued sychronizer,本质就是一个抽象类。 AQS中有一个核心属性state,其次还有一个双向链表以及一个单项链表。 首先state是基于volatile修饰&#x…...
研报精选230219
目录 【行业230219山西证券】煤炭行业周报:复工改善,港口价格企稳反弹【行业230219中航证券】农林牧渔行业周观点:一号文件落地,生物育种超势不改【行业230219华西证券】汽车行业周报:新车密集上市 自主转型提速【个股…...
【PPPoE】PPPoE拨号流程
简介 PPPoE(Point-to-Point Protocol over Ethernet)是一种在以太网上封装PPP协议的方式,常用于在宽带接入中进行拨号。 PPPoE的拨号原理如下: 客户端发起PPPoE Active Discovery Initiation (PADI)报文,广播到网络…...
django项目实战(django+bootstrap实现增删改查)
目录 一、创建django项目 二、修改默认配置 三、配置数据库连接 四、创建表结构 五、在app当中创建静态文件 六、页面实战-部门管理 1、实现一个部门列表页面 2、实现新增部门页面 3、实现删除部门 4、实现部门编辑功能 七、模版的继承 1、创建模板layout.html 1&…...
Lesson4---Python语言基础(2)
4.1 内置数据结构 4.1.1 序列数据结构(sequence) 成员是有序排列的每个元素的位置称为下标或索引通过索引访问序列中的成员Python中的序列数据类型有字符串、列表、元组 “abc” ≠ “bac” 4.1.1.1 创建列表和元组 Python中的列表和元组,…...
NCHW - NHWC - CHWN 排列
TensorFlow有两种数据格式NHWC和NCHW,默认的数据格式是NHWC,可以通过参数data_format指定数据格式。这个参数规定了 input Tensor 和 output Tensor 的排列方式。 1、data_format 设置为 “NHWC” 时,排列顺序为 [batch, height, width, channels] 设置为 “NCHW” 时,排…...
2019蓝桥杯真题矩阵切割(填空题) C语言/C++
题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。 当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正…...
3个创新点让游戏优化工具实现高效资源管理
3个创新点让游戏优化工具实现高效资源管理 【免费下载链接】sguard_limit 限制ACE-Guard Client EXE占用系统资源,支持各种腾讯游戏 项目地址: https://gitcode.com/gh_mirrors/sg/sguard_limit 你是否曾遇到这样的场景:激战正酣时画面突然定格&a…...
Apollo配置中心实战:从零到一的Docker化部署与核心配置详解
1. 为什么选择Apollo配置中心 在微服务架构中,配置管理一直是个让人头疼的问题。记得我第一次尝试用传统properties文件管理配置时,光是同步不同环境的配置就浪费了大半天时间。后来接触到Apollo,才发现原来配置管理可以这么优雅。 Apollo作为…...
Pixel Dream Workshop 创意激发:利用算法生成无限可能的艺术图案与纹理
Pixel Dream Workshop 创意激发:利用算法生成无限可能的艺术图案与纹理 1. 当算法遇见艺术:数字创作的新纪元 在传统艺术创作中,设计师们常常需要花费大量时间手工绘制图案和纹理。而如今,Pixel Dream Workshop的出现彻底改变了…...
蓝桥杯备赛:Day5-P1036 选数
📚 算法笔记:P1036 [NOIP 2002 普及组] 选数 1. 题目描述 [P1036 NOIP 2002 普及组] 选数 - 洛谷 从 nnn 个整数中任选 kkk 个数相加,统计有多少种选法的和为质数。 数据范围:n≤20,k<nn \le 20, k < nn≤20,k<n&…...
Youtu-VL-4B-Instruct保姆级部署教程:5分钟搞定看图说话AI,小白也能快速上手
Youtu-VL-4B-Instruct保姆级部署教程:5分钟搞定看图说话AI,小白也能快速上手 1. 为什么选择Youtu-VL-4B-Instruct? Youtu-VL-4B-Instruct是一个能同时理解图片和文字的AI模型,它基于腾讯优图实验室开发的40亿参数视觉语言模型。…...
SystemVerilog约束(constraint)里的“坑”与“宝”:从dist权重到solve...before的实战避坑指南
SystemVerilog约束设计中的精妙陷阱与高阶技巧:从概率调控到验证效能提升 在芯片验证领域,SystemVerilog的约束随机验证(CRV)就像一把双刃剑——用得巧妙可以大幅提升验证效率,但若忽视约束系统的精微特性,反而会引入难以察觉的验…...
保姆级教程:在绿联NAS的Docker里部署PaddleOCR,打造本地私有化文字识别服务
绿联NASDockerPaddleOCR:三步构建家庭级隐私文字识别中心 想象一下这样的场景:周末整理书房时,你翻出一叠泛黄的老照片和手写笔记,想将它们数字化保存却又担心上传到云端OCR服务会泄露家庭隐私;或是收到一份重要合同需…...
告别Keil C51安装烦恼:STC8单片机开发环境保姆级配置指南(含芯片包添加)
从零搭建STC8开发环境:Keil C51避坑指南与实战技巧 第一次接触STC8单片机时,最让人头疼的莫过于开发环境的搭建。网上教程要么过于简略,要么步骤不全,总会在某个环节卡住——可能是Keil安装报错,可能是芯片包添加失败&…...
fa‘s‘d‘f
fa’s’d’fa’d...
他没有打断我,没有说“小孩子懂什么” ,30岁这年,我不仅拿到了父亲的认可,更拿到了他毫无保留的信任
30岁这年,我和我爸 今天和我爸坐在阳台的小茶桌前,泡了他藏了快十年的普洱,烟缸里攒了四根烟蒂,聊了整整两个小时。 散场的时候我站在窗边看他下楼开车,突然反应过来——我们今天这场对话,从头到尾没有一句“你要听话”,没有一句“钱够不够花”,没有长辈居高临下的说…...
