QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等

news2024/9/24 17:17:30

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());
#endif

QT_BEGIN_NAMESPACE
namespace Ui { class MP3; }
QT_END_NAMESPACE

class MP3 : public QWidget
{
    Q_OBJECT

public:
    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);

    //访问http
    void 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;
#else
    int screenCount = qApp->desktop()->screenCount();
#endif

    if (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)) {
#else
            if (qApp->desktop()->screenGeometry(i).contains(pos)) {
#endif
                screenIndex = 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();
#else
        rect = qApp->desktop()->availableGeometry(screenIndex);
#endif
    } else {
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
        rect = qApp->screens().at(screenIndex)->geometry();
#else
        rect = qApp->desktop()->screenGeometry(screenIndex);
#endif
    }
    qDebug()<<"rect = "<<rect;
    return rect;
}

隐藏窗口标题 最大化 最小化 关闭

生成一个无边界的窗口。用户不能通过窗口系统移动或调整无边界窗口的大小。
在x11上,标志的结果取决于窗口管理器和它理解主题和/或网络提示的能力。
大多数现有的现代窗口管理器都可以处理这个问题。

this->setWindowFlag(Qt::FramelessWindowHint);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/356598.html

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

相关文章

C进阶:5.动态内存管理

目录 1.为什么存在动态内存分配 2.动态内存函数的介绍 2.1 malloc 和 free 2.2 calloc malloc 与 calloc的区别&#xff1a; 2.3 realloc 3.常见的动态内存错误 3.1对NULL指针的解引用操作 3.2对动态开辟空间的越界访问 3.3对非动态开辟的内存使用free释放 3.4使用f…

帮助指令 man ,help及文档常用管理指令

帮助指令 man&#xff0c;help 1. man 当我们想要了解某个命令如何使用&#xff0c;及选项的含义是什么以及配置文件的帮助信息时&#xff0c;可以使用 man [命令或配置文件]&#xff0c;这样便可以获得到帮助提示信息了。 语法格式&#xff1a;man [命令或者配置文件] 比如…

[SSD科普之2] SATA、mSATA、M.2、M.2(NVMe)、PCIE固态硬盘接口详解

固态硬盘概念固态驱动器&#xff08;Solid State Drive&#xff09;&#xff0c;俗称固态硬盘&#xff0c;固态硬盘是用固态电子存储芯片阵列而制成的硬盘&#xff0c;因为台湾英语里把固体电容称之为Solid而得名。SSD由控制单元和存储单元&#xff08;FLASH芯片、DRAM芯片&…

最全280个上市公司数字化转型指标(2010-2021年)

基于年报测度数字化的论文在中文顶刊已有有趣的研究发表&#xff0c;从深交所、上交所下载2010-2021年上市公司年报&#xff0c;提取MD&A部分&#xff0c;基于《管理世界》、《经济研究》等期刊论文构建企业数字化词典&#xff08;详细参考见后文&#xff09;&#xff0c;将…

JavaScript系列之实现继承的几种方式

文章の目录一、借助父构造函数继承属性1、实现方式2、优点3、缺点二、原型链继承1、实现方式2、优点3、缺点三、组合继承四、ES6继承的实现方式参考写在最后一、借助父构造函数继承属性 1、实现方式 先定义一个父构造函数(this指向为window)&#xff1b;再定义一个子构造函数…

了解Nginx,这一篇就够了

了解Nginx&#xff0c;这一篇就够了1.Nginx应用场景2.Nginx相关概念正向代理和反向代理负载均衡动静分离3.Nginx配置文件解析全局块events块http块1.Nginx应用场景 HTTP服务器&#xff1a;Nginx本身也是一个静态资源的服务器&#xff0c;当只有静态资源的时候&#xff0c;就可…

玩转 Kubernetes 配置管理:ConfigMap 和 Secret 实战演示

目录一、简介二、ConfigMap2.1 基于目录创建 ConfigMap2.2 基于文件创建 ConfigMap2.3 从环境文件创建 ConfigMap2.4 定义从文件创建 ConfigMap 时要使用的键2.5 根据字符串创建 ConfigMap三、Secret3.1 基于文件创建Secret3.2 基于字符串创建Secret3.3 yaml文件方式创建secret…

安卓项目搭建grpc环境

本篇文章使用的IDE是Android Studio。这里先吐槽一句&#xff0c;安卓项目搭建grpc环境&#xff0c;不管是引入插件还是引入第三方库&#xff0c;对于版本的要求都极为苛刻&#xff0c;一旦版本不匹配就会报错&#xff0c;所以对于版本的搭配一定要注意。 下面介绍的这个版本搭…

CMake中cmake_host_system_information的使用

CMake中的cmake_host_system_information命令用于查询各种主机系统信息&#xff0c;其格式如下&#xff1a; cmake_host_system_information(RESULT <variable> QUERY <key> ...) # 1 cmake_host_system_information(RESULT <variable>QUERY WINDOWS_REGIST…

【爬虫理论实战】详解常见头部反爬技巧与验证方式 | 有 Python 代码实现

以下是常见头部反爬技巧与验证方式的大纲&#xff1a; User-Agent 字段的伪装方式&#xff0c;Referer 字段的伪装方式&#xff0c;Cookie 字段的伪装方式。 文章目录1. ⛳️ 头部反爬技巧1.1. User-Agent 字段&User-Agent 的作用1.2. 常见 User-Agent 的特征1.3. User-Age…

Spring IoC容器之常见常用注解以及注解编程模型简介

一、全文概览 本篇文章主要学习记录Spring中的核心注解&#xff0c;罗列常见常用的注解以及Spring中的注解编程模型介绍 二、核心注解 1、Spring模式注解 常用注解场景描述Spring起始支持版本Component通用组件模式注解&#xff0c;是所有组件类型注解的元注解Spring 2.5Repo…

【分库分表】企业级分库分表实战方案与详解(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

计算机操作系统概述

文章目录1.0 操作系统概述1.1 操作系统的目标1.2 操作系统的功能1.3 操作系统结构1.4 操作系统接口1.5 操作系统的发展1.6 操作系统的特征2.0 进程管理2.1 进程调度2.2 进程调度算法2.3 进程间通信2.4 进程间的同步2.5 软件实现互斥的方法2.6 硬件实现互斥的方法2.7 信号2.8 管…

python基于django 医院急诊挂号系统

目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2.1 JAVA简介 4 2.2MyEclipse环境配置 4 2.3 B/S结构简介 4 2.4MySQL数据库 5 2.5 SPRINGBOOT框架 5 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3.…

Mysql(二)索引、查询

索引一、索引索引分类MySQL索引结构**B和B-树的区别**语法创建修改删除查看二、MySQL查询一、索引 概念&#xff1a; 索引时帮助MySQL高效获取数据的数据结构 本质&#xff1a; 数据结构 实现&#xff1a; 在存储引擎层面实现的&#xff0c;而不是server层面。不是所有的存储引…

CNI 网络分析(九)Calico IPIP

文章目录环境流量分析Pod 间Node 到 PodPod 到 serviceNode 到 serviceNetworkPolicy理清和观测网络流量环境 可以看到&#xff0c;在宿主机上有到每个 pod IP 的路由指向 veth 设备 到对端节点网段的路由 指向 tunl0 下一跳 ens10 的 ip 有到本节点网段 第一个 ip 即 tunl0 的…

Prometheus监控案例之blackbox-exporter

blackbox-exporter简介 blackbox-exporter项目地址&#xff1a;https://github.com/prometheus/blackbox_exporter blackbox-exporter是Prometheus官方提供的一个黑盒监控解决方案&#xff0c;可以通过HTTP、HTTPS、DNS、ICMP、TCP和gRPC方式对目标实例进行检测。可用于以下使…

基于计算机视觉的建筑物火灾早期探测模型的开发

1.文章信息本次介绍的文章是2023年韩国延世大学作为一作发表的一篇关于基于计算机视觉的火灾检测文章&#xff0c;题目为《Development of early fire detection model for buildings using computer vision-based CCTV》。2.摘要建筑物的火灾直接影响到居住者的生命。因此&…

FL Studio最新发布21版本更新全部内容详情介绍

FL Studio最新发布21版本&#xff0c;也是一次重要的版本更新&#xff0c;让使用FL Studio软件的音乐制作人们进入到了全新的AI编曲时代&#xff0c;并改进了80多操作页面包括用户页面、项目文件夹、常规设置、导出导入等等&#xff0c;使用起来更加的简洁。本期给大家带来的是…

相关性-回忆录(持续更新)

1.TODO方向 &#xff08;1&#xff09;数据增强&#xff1a;finetuning阶段需要大量人工标注样本&#xff0c;消耗时间和成本。用户点击数据作为弱监督学习&#xff0c;可以尝试图网络构建节点和边&#xff08;query聚合&#xff09;&#xff1b; 使用展现未点击生成对抗网络进…