QT 系统学习 day04 事件 HTTP网络请求, 音乐播放器,上位机串口通行

news2025/1/16 7:44:54

1.HTTP  网

1.头文件 : 

网络

/***** HTTP 网络相关模块 *****/
#include <QNetworkAccessManager>    /** 网络访问类 **/
#include <QNetworkRequest>          /** 网络请求数据类 **/
#include <QNetworkReply>            /** 网络结果数据类 **/
#include <QUrl>                     /** 网络超链接类 **/

JSON  (因为传输的数据都是  JSON 类型,所以我们需要利用 jSOn 解析)

#include <QJsonDocument>    /** 解析JSON的类 **/
#include <QJsonObject>      /** JSON的类 **/
#include <QJsonArray>       /** JSON的数组类 **/
#include <QJsonValue>       /** JSON的各种值类 **/

2. 两种请求的方法

函数:get(QNetworkRequest(url));  //参数1  请求的链接

            post(QNetworkRequest(url),data.toUtf8());//参数1 请求的链接, 参数2 一个字符串

3.学习怎么用网络请求 

4.建立一个对象,并且实列化

QNetworkAccessManager *m_http;  /** 网络访问类 对象 **/

  m_http = new QNetworkAccessManager(this);//实列化
  

5.建立 信号接收数据的链接 

connect(m_http,SIGNAL(finished(QNetworkReply*)),this,SLOT(slot_http_finished(QNetworkReply*)));

finished(QNetworkReply*) 是一个信号,他是网络上有数据可以接收,

slot_http_finished(QNetworkReply*) 是自己的槽函数

6.开始向网络请求 拿到数据

利用上面的两个函数:(两种方法)


void MainWindow::slot_pushButton_request()
{
    QString city = ui->lineEdit_city->text();
    QUrl url = QString("http://query.asilu.com/weather/baidu/?city=%1").arg(city);//请求天气的链接
#if 0
    /**** HTTP的get请求 ****/
    m_http->get(QNetworkRequest(url));//第一种
#else
    /**** HTTP的post请求 ****/
    QString data;
    m_http->post(QNetworkRequest(url),data.toUtf8());//第二种
#endif
}

7.当有数据来的时候 接收数据

  QByteArray data = Reply->readAll(); // 接收数据

8. 解析代码 使用 JSON 

函数  QJsonDocument::fromJson(data);   //把 QByteArray  变成  QJsonDocument 类型

QJsonObject JsonObject= JsonDocument.object(); /***.objext 转换成JSON对象 ***/

 QJsonArray JsonArray = JsonObject["weather"].toArray(); /*** toArray 转换成JSON数组 ***/

xxx.toString  ///转换为字符串

可以请求的网站链接: 自己找吧!!(搜索,HTTP  请求 xxx 的接口API 就可以了)

所有的代码:

ui 设计界面

头文件 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
/***** HTTP 网络相关模块 *****/
#include <QNetworkAccessManager>    /** 网络访问类 **/
#include <QNetworkRequest>          /** 网络请求数据类 **/
#include <QNetworkReply>            /** 网络结果数据类 **/
#include <QUrl>                     /** 网络超链接类 **/

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QNetworkAccessManager *m_http;  /** 网络访问类 对象 **/
public slots:
    void slot_http_finished(QNetworkReply* Reply);
    void slot_pushButton_request();
};
#endif // MAINWINDOW_H

 .cpp 文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    /*** 申请网络访问类对象空间 ***/
    m_http = new QNetworkAccessManager(this);
    /*** 网络访问类有数据可读信号(完成请求) ***/
    connect(m_http,SIGNAL(finished(QNetworkReply*)),this,SLOT(slot_http_finished(QNetworkReply*)));
    connect(ui->pushButton_request,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_request()));
}

void MainWindow::slot_pushButton_request()
{
    QString city = ui->lineEdit_city->text();
    QUrl url = QString("http://query.asilu.com/weather/baidu/?city=%1").arg(city);
#if 0
    /**** HTTP的get请求 ****/
    m_http->get(QNetworkRequest(url));
#else
    /**** HTTP的post请求 ****/
    QString data;
    m_http->post(QNetworkRequest(url),data.toUtf8());
#endif
}

#include <QJsonDocument>    /** 解析JSON的类 **/
#include <QJsonObject>      /** JSON的类 **/
#include <QJsonArray>       /** JSON的数组类 **/
#include <QJsonValue>       /** JSON的各种值类 **/
void MainWindow::slot_http_finished(QNetworkReply *Reply)
{
    QByteArray data = Reply->readAll(); // 接收数据

    QJsonDocument JsonDocument = QJsonDocument::fromJson(data); //解析JSON
    if(JsonDocument.isObject() == true)
    {
        //ui->textBrowser_JSON->setText(JsonDocument.toJson()); //转换成JSON格式的字符串方便显示
        QJsonObject JsonObject= JsonDocument.object(); /*** 转换成JSON对象 ***/
        /*** 清空JSON结果框 ***/
        ui->textBrowser_JSON->clear();
        ui->textBrowser_JSON->append(QString("城市:") + JsonObject["city"].toString());
        ui->textBrowser_JSON->append(QString("日期:") + JsonObject["date"].toString());
        ui->textBrowser_JSON->append(QString("时间:") + JsonObject["update_time"].toString());

        QJsonArray JsonArray = JsonObject["weather"].toArray(); /*** 转换成JSON数组 ***/
        QString times[] = {"今天:","明天:","后天:","大后天:","大大后天:"};
        for(int i = 0; i < 5;i++)
        {
            QJsonObject JsonObject = JsonArray[i].toObject();
            ui->textBrowser_JSON->append(times[i] + JsonObject["temp"].toString());
        }
    }
}




MainWindow::~MainWindow()
{
    delete ui;
}





2. 串口连接

1.头文件:

/***** 串口模块 ******/
#include <QSerialPort> //串口类
#include <QSerialPortInfo> //串口属性类 { 获取系统可用的串口 }

2.建立对象并且实列化对象:

QSerialPort *SerialPort; /** 串口类 **/
 SerialPort = new QSerialPort(this);//实列化对象

3.各种函数

   /*** 类构造时就获取系统可用串口列表 ***/
    GetSystenSerilPort();

    /***  写入数据 ***/
    write(text.toUtf8());

    /*** 读取数据 ***/
     readAll();
    
    /******* 设置串口属性 ******/
    SerialPort->setPortName(ui->comboBox_portName->currentText()); //设置串口号
    SerialPort->setBaudRate(ui->comboBox_BaudRate->currentText().toInt()); //设置波特率
    SerialPort->setDataBits(QSerialPort::Data8); //设置数据位为8位
    SerialPort->setParity(QSerialPort::NoParity); //设置校验位为无校验
    SerialPort->setStopBits(QSerialPort::OneStop); //设置停止位为1位
    
    /***** 打开串口 ****/
    bool ok = false;
    ok = SerialPort->open(QIODevice::ReadWrite);

    /**  关闭串口 **/
    SerialPort->close(); //关闭串口

4.首先是配置串口属性

/******* 设置串口属性 ******/
    SerialPort->setPortName(ui->comboBox_portName->currentText()); //设置串口号
    SerialPort->setBaudRate(ui->comboBox_BaudRate->currentText().toInt()); //设置波特率
    SerialPort->setDataBits(QSerialPort::Data8); //设置数据位为8位
    SerialPort->setParity(QSerialPort::NoParity); //设置校验位为无校验
    SerialPort->setStopBits(QSerialPort::OneStop); //设置停止位为1位

5.打开串口

 bool ok = false;
 ok = SerialPort->open(QIODevice::ReadWrite);

6.写数据

void MainWindow::slot_pushButton_send()
{
    QString text = ui->lineEdit_send->text();//获取要发送的数据

    SerialPort->write(text.toUtf8());//发送数据
}

7.建立读取数据的信号连接,当数据来的时候,就可以知道有数据可以读取。

connect(SerialPort,SIGNAL(readyRead()),this,SLOT(slot_SerialPort_readyRead()));

参数1  出口类指针,  参数2  信号, 

8.关闭串口,

  SerialPort->close(); //关闭串口


ui设计界面

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
/***** 串口模块 ******/
#include <QSerialPort> //串口类
#include <QSerialPortInfo> //串口属性类 { 获取系统可用的串口 }
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
public:
    void GetSystenSerilPort(); /*** 获取系统可用串口列表,并打印到UI界面 ***/
private:
    Ui::MainWindow *ui;
    QSerialPort *SerialPort; /** 串口类 **/

public slots:
    void slot_pushButton_open();
    void slot_pushButton_send();
    void slot_SerialPort_readyRead();
};

#endif // MAINWINDOW_H

。cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    /*** 申请串口类对象空间 ****/
    SerialPort = new QSerialPort(this);
    /*** 类构造时就获取系统可用串口列表 ***/
    GetSystenSerilPort();

    /*** 连接槽函数 ****/
    connect(ui->pushButton_open,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_open()));
    connect(SerialPort,SIGNAL(readyRead()),this,SLOT(slot_SerialPort_readyRead()));
    connect(ui->pushButton_send,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_send()));
}

void MainWindow::slot_pushButton_send()
{
    QString text = ui->lineEdit_send->text();

    SerialPort->write(text.toUtf8());
}


void MainWindow::slot_SerialPort_readyRead()
{
    QByteArray data = SerialPort->readAll();
    ui->textBrowser_read->append(data);
}


#include <QMessageBox> /*** 标准对话框 ****/
void MainWindow::slot_pushButton_open()
{
    /******* 设置串口属性 ******/
    SerialPort->setPortName(ui->comboBox_portName->currentText()); //设置串口号
    SerialPort->setBaudRate(ui->comboBox_BaudRate->currentText().toInt()); //设置波特率
    if(ui->comboBox_DataBits->currentText() == "8"){
        SerialPort->setDataBits(QSerialPort::Data8); //设置数据位为8位
    }
    if(ui->comboBox_Parity->currentText() == "无校验"){
        SerialPort->setParity(QSerialPort::NoParity); //设置校验位为无校验
    }

    if(ui->comboBox_StopBits->currentText() == "1"){
        SerialPort->setStopBits(QSerialPort::OneStop); //设置停止位为1位
    }
    /***** 打开串口 ****/
    bool ok = false;
    if(ui->pushButton_open->text() == "打开串口")
    {
        ok = SerialPort->open(QIODevice::ReadWrite);
        if(ok == true) //串口打开成功
        {
            ui->groupBox_data->setEnabled(true);
            ui->pushButton_open->setText("关闭串口");
        }
        else
        {
            QMessageBox::warning(this,"警告","串口打开失败,请检查串口参数或串口已被占用");
            return ;
        }
    }else
    {
        SerialPort->close(); //关闭串口
        ui->pushButton_open->setText("打开串口");
        ui->groupBox_data->setEnabled(false);
    }
}




MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::GetSystenSerilPort()
{
    QList<QSerialPortInfo> list_SerialPortInfo = QSerialPortInfo::availablePorts(); /*** 获取系统可用串口列表 ***/

    ui->comboBox_portName->clear(); /** 清空 串口号的下拉选项框 ***/
    for(QSerialPortInfo value : list_SerialPortInfo)
    {
        ui->comboBox_portName->addItem(value.portName()); /*** 将串口名称添加到 UI 的串口号下拉选项框中 ***/
    }
}






3.音乐播放 (.mp3  .wav  .mp4都可播放)

1.头文件

#include <QMainWindow>
/***** 多媒体音视频播放类 ****/
#include <QMediaPlayer> /*** 多媒体播放类 ***/
#include <QMediaPlaylist>/*** 多媒体播放列表类 ***/
/***** 对话框相关类 *****/
#include <QFileDialog> /** 文件对话框 ***/

2.定义播放对象,和播放列表对象,并且实列化,把播放列表设置到播放器里面 

    QMediaPlayer *MediaPlayer; /*** 多媒体播放类 ***/
    QMediaPlaylist *MediaPlaylist; /*** 多媒体播放列表类 ***/

    /**** 申请多媒体播放类空间 ****/
    MediaPlayer = new QMediaPlayer(this);
    MediaPlaylist = new QMediaPlaylist(this);

     /**** 将播放列表设置到播放器中 ****/
    MediaPlayer->setPlaylist(MediaPlaylist);


3.设置时间的函数  与建立信号连接  (获取音乐时间的总长度,并且计算)

connect(MediaPlayer,SIGNAL(durationChanged(qint64)),this,SLOT(slot_MediaPlayer_durationChanged(qint64)));

/******** 时间转换函数 *******/
void time_cycle(QString &time,qint64 msec)
{
    /**** 计算总时间 ****/
    int seconds = msec / 1000; //秒钟
    int minute = seconds / 60; //分钟
    int hour = minute / 60 % 24; //小时

    if(hour == 0)
    {
        time = QString::number(minute%60) + ":" + QString::number(seconds%60);
    }
    else
    {
        time = QString::number(hour%24) + ":" + QString::number(minute%60) + ":" + QString::number(seconds%60);
    }
}

void Player::slot_MediaPlayer_durationChanged(qint64 dura)
{
    ui->horizontalSlider_progress->setMaximum(dura);
    time_cycle(time2,dura); /** 调用时间转换算法 函数**/
    ui->label_ratio->setText(time1 + "/" + time2);

    ui->label_name->setText(ui->listWidget->currentItem()->text());
}

4.视屏播放(mp4)

 /**** 将Paly播放器数据输出到UI ,需要解码器的支持 *****/
    MediaPlayer->setVideoOutput(ui->VideoWidget);


5.加入本地的音乐文件 

void Player::slot_pushButton_add()
{
    QList<QUrl> file_Urls = QFileDialog::getOpenFileUrls(this,"添加音乐",QUrl("C:\\Users\\Administrator\\Music"),
                                 "音乐 (*.mp3 *.WAV) ;;视频 (*.mp4 *.avi) ;;所有文件 (*.*)");//添加音乐文件
    for(int i = 0; i < file_Urls.size() ; i++)
    {
        ui->listWidget->addItem(file_Urls[i].fileName()); //将文件名添加到 ListWidget 的UI控件显示
        MediaPlaylist->addMedia(QMediaContent(file_Urls[i])); //将文件添加到里面 (播放列表)
    }
}

6.设置音乐播放速度的函数

void Player::slot_comboBox_rate(QString text)
{
    float rate = text.toFloat();//把QString 类型变为 float 类型
    MediaPlayer->setPlaybackRate(rate);//调节倍速
}

7.设置 正在播放的音乐 现在的时长  (包括建立连接)

connect(MediaPlayer,SIGNAL(positionChanged(qint64)),this,SLOT(slot_MediaPlayer_positionChanged(qint64)));//建立连接

void Player::slot_MediaPlayer_positionChanged(qint64 posi)
{
    ui->horizontalSlider_progress->setValue(posi);
    time_cycle(time1,posi); /** 调用时间转换算法 函数**/
    ui->label_ratio->setText(time1 + "/" + time2);
}

8.音乐播放 静音模式 

函数:MediaPlayer->setMuted();  

9.设置音乐现在的播放进度 (包括信号连接)

horizontalSlider_progress,SIGNAL(valueChanged(int)),this,SLOT(slot_horizontalSlider_progress(int)));//信号连接
    

void Player::slot_horizontalSlider_progress(int value)
{
    if(ui->horizontalSlider_progress->isSliderDown() == true)
    {
        MediaPlayer->setPosition(value);
    }
}

10.设置声音播放的大小 (包括信号连接)

comboBox_rate,SIGNAL(currentTextChanged(QString)),this,SLOT(slot_comboBox_rate(QString)));


void Player::slot_comboBox_rate(QString text)
{
    float rate = text.toFloat();
    MediaPlayer->setPlaybackRate(rate);
}

11.一些音乐播放的基本操作, (播放,暂停,。。。。。)

    connect(ui->pushButton_play,SIGNAL(clicked(bool)),MediaPlayer,SLOT(play()));//播放
    connect(ui->pushButton_pause,SIGNAL(clicked(bool)),MediaPlayer,SLOT(pause()));//暂停
    connect(ui->pushButton_stop,SIGNAL(clicked(bool)),MediaPlayer,SLOT(stop()));//停止
    connect(ui->pushButton_next,SIGNAL(clicked(bool)),MediaPlaylist,SLOT(next()));//下一首
    connect(ui->pushButton_previous,SIGNAL(clicked(bool)),MediaPlaylist,SLOT(previous()));//上一首


ui 设计界面

头文件

#ifndef PLAYER_H
#define PLAYER_H

#include <QMainWindow>
/***** 多媒体音视频播放类 ****/
#include <QMediaPlayer> /*** 多媒体播放类 ***/
#include <QMediaPlaylist>/*** 多媒体播放列表类 ***/
/***** 对话框相关类 *****/
#include <QFileDialog> /** 文件对话框 ***/

QT_BEGIN_NAMESPACE
namespace Ui { class Player; }
QT_END_NAMESPACE

class Player : public QMainWindow
{
    Q_OBJECT

public:
    Player(QWidget *parent = nullptr);
    ~Player();
public:
    void Media_Init();
private:
    Ui::Player *ui;
    QMediaPlayer *MediaPlayer; /*** 多媒体播放类 ***/
    QMediaPlaylist *MediaPlaylist; /*** 多媒体播放列表类 ***/
    QString time1; //当前时长
    QString time2; //总时长
public slots:
    void slot_pushButton_add();
    void slot_comboBox_rate(QString text);
    void slot_MediaPlaylist(int index);
    void slot_pushButton_delete();
    /***** 进度相关槽函数 *****/
    void slot_MediaPlayer_durationChanged(qint64 dura); //总时长发生改变对接该槽函数
    void slot_MediaPlayer_positionChanged(qint64 posi); //进度时间改变
    void slot_horizontalSlider_progress(int value); //进度滑块值改变对接该槽函数
    /***** 声音相关槽函数 *****/
    void slot_checkBox_volume(bool ok);
};
#endif // PLAYER_H

 。cpp文件

#include "player.h"
#include "ui_player.h"

Player::Player(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::Player)
{
    ui->setupUi(this);
    /**** 申请多媒体播放类空间 ****/
    MediaPlayer = new QMediaPlayer(this);
    MediaPlaylist = new QMediaPlaylist(this);
    /**** 将播放列表设置到播放器中 ****/
    MediaPlayer->setPlaylist(MediaPlaylist);
    /**** 将自带的音乐文件资源添加到播放器 ****/
    //Media_Init();
    /**** 初始化音乐播放器 ******/
    MediaPlayer->setVolume(ui->horizontalSlider_volume->value()); //初始化音量为UI界面的音量
    /**** 将Paly播放器数据输出到UI ,需要解码器的支持 *****/
    MediaPlayer->setVideoOutput(ui->VideoWidget);
    /**** 信号槽操作播放列表 *****/
    connect(ui->pushButton_add,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_add()));
    connect(ui->pushButton_delete,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_delete()));
    /**** 信号槽操作播放器 *******/
    connect(ui->pushButton_play,SIGNAL(clicked(bool)),MediaPlayer,SLOT(play()));
    connect(ui->pushButton_pause,SIGNAL(clicked(bool)),MediaPlayer,SLOT(pause()));
    connect(ui->pushButton_stop,SIGNAL(clicked(bool)),MediaPlayer,SLOT(stop()));
    connect(ui->pushButton_next,SIGNAL(clicked(bool)),MediaPlaylist,SLOT(next()));
    connect(ui->pushButton_previous,SIGNAL(clicked(bool)),MediaPlaylist,SLOT(previous()));

    connect(ui->horizontalSlider_volume,SIGNAL(valueChanged(int)),MediaPlayer,SLOT(setVolume(int)));
    connect(ui->comboBox_rate,SIGNAL(currentTextChanged(QString)),this,SLOT(slot_comboBox_rate(QString)));
    connect(MediaPlaylist,SIGNAL(currentIndexChanged(int)),this,SLOT(slot_MediaPlaylist(int)));

    connect(ui->listWidget,SIGNAL(currentRowChanged(int)),MediaPlaylist,SLOT(setCurrentIndex(int)));

    /************ 进度相关信号槽功能 *************/
    connect(MediaPlayer,SIGNAL(durationChanged(qint64)),this,SLOT(slot_MediaPlayer_durationChanged(qint64)));
    connect(ui->horizontalSlider_progress,SIGNAL(valueChanged(int)),this,SLOT(slot_horizontalSlider_progress(int)));
    connect(MediaPlayer,SIGNAL(positionChanged(qint64)),this,SLOT(slot_MediaPlayer_positionChanged(qint64)));
    /************ 声音按钮信号槽 ******************/
    connect(ui->checkBox_volume,SIGNAL(clicked(bool)),this,SLOT(slot_checkBox_volume(bool)));
#if 0 //单文件
    MediaPlayer->setMedia(QMediaContent(QUrl("qrc:/音乐歌曲素材/噪 - 印度神曲Nijamena.mp3")));
    MediaPlayer->play(); /*** 播放 ***/
#endif
}

void Player::slot_horizontalSlider_progress(int value)
{
    if(ui->horizontalSlider_progress->isSliderDown() == true)
    {
        MediaPlayer->setPosition(value);
    }
}

void Player::slot_checkBox_volume(bool ok)
{
    MediaPlayer->setMuted(ok);
    if(ok == true)
    {
        ui->checkBox_volume->setIcon(QIcon(":/音乐播放器图片素材/jingyin.png")); //静音
    }
    else
    {
        ui->checkBox_volume->setIcon(QIcon(":/音乐播放器图片素材/shengyin.png")); //开声音
    }
}

/******** 时间转换函数 *******/
void time_cycle(QString &time,qint64 msec)
{
    /**** 计算总时间 ****/
    int seconds = msec / 1000; //秒钟
    int minute = seconds / 60; //分钟
    int hour = minute / 60 % 24; //小时

    if(hour == 0)
    {
        time = QString::number(minute%60) + ":" + QString::number(seconds%60);
    }
    else
    {
        time = QString::number(hour%24) + ":" + QString::number(minute%60) + ":" + QString::number(seconds%60);
    }
}

void Player::slot_MediaPlayer_durationChanged(qint64 dura)
{
    ui->horizontalSlider_progress->setMaximum(dura);
    time_cycle(time2,dura); /** 调用时间转换算法 函数**/
    ui->label_ratio->setText(time1 + "/" + time2);

    ui->label_name->setText(ui->listWidget->currentItem()->text());
}

void Player::slot_MediaPlayer_positionChanged(qint64 posi)
{
    ui->horizontalSlider_progress->setValue(posi);
    time_cycle(time1,posi); /** 调用时间转换算法 函数**/
    ui->label_ratio->setText(time1 + "/" + time2);
}







void Player::slot_pushButton_delete()
{
    int row = ui->listWidget->currentRow();
    delete ui->listWidget->takeItem(row);
    MediaPlaylist->removeMedia(row);
}







void Player::slot_MediaPlaylist(int index)
{
    int row = index;
    ui->listWidget->setCurrentRow(row);
}




void Player::slot_comboBox_rate(QString text)
{
    float rate = text.toFloat();
    MediaPlayer->setPlaybackRate(rate);
}



void Player::Media_Init()
{
    {
        QUrl url("qrc:/音乐歌曲素材/噪 - 印度神曲Nijamena.mp3");
        ui->listWidget->addItem(url.fileName()); //将文件名添加到 ListWidget 的UI控件显示
        MediaPlaylist->addMedia(QMediaContent(url)); //将文件添加到里面
    }
    {
        QUrl url("qrc:/音乐歌曲素材/果冻 - 成功没有退路.mp3");
        ui->listWidget->addItem(url.fileName()); //将文件名添加到 ListWidget 的UI控件显示
        MediaPlaylist->addMedia(QMediaContent(url)); //将文件添加到里面
    }
    {
        QUrl url("qrc:/音乐歌曲素材/蒋蒋 _ 朱贺 - 爱德华的小说.mp3");
        ui->listWidget->addItem(url.fileName()); //将文件名添加到 ListWidget 的UI控件显示
        MediaPlaylist->addMedia(QMediaContent(url)); //将文件添加到里面
    }
}

void Player::slot_pushButton_add()
{
    QList<QUrl> file_Urls = QFileDialog::getOpenFileUrls(this,"添加音乐",QUrl("C:\\Users\\Administrator\\Music"),
                                 "音乐 (*.mp3 *.WAV) ;;视频 (*.mp4 *.avi) ;;所有文件 (*.*)");
    for(int i = 0; i < file_Urls.size() ; i++)
    {
        ui->listWidget->addItem(file_Urls[i].fileName()); //将文件名添加到 ListWidget 的UI控件显示
        MediaPlaylist->addMedia(QMediaContent(file_Urls[i])); //将文件添加到里面
    }
}


Player::~Player()
{
    delete ui;
}




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

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

相关文章

Spring学习:五、AOP 面向切面编程、Spring与Mybatis整合

7. AOP 面向切面编程 7.1 AOP概述 ​ AOP英文名为Aspect Oriented Programming&#xff0c;意为面向切面编程&#xff0c;通过预编译方式和运行期间动态代理实现程序功能统一维护的一种技术。AOP是OOP的延续&#xff0c;是Spring框架中的一个重要内容&#xff0c;利用AOP可以…

C++不知算法系列之排序从玩转冒泡算法开始

1. 前言 所谓排序&#xff0c;指把数据群体按个体数据的特征按从大到小或从小到大的顺序存放。 排序在应用开发中很常见&#xff0c;如对商品按价格、人气、购买数量等排序&#xff0c;便于使用者快速找到数据。 常见的排序算法分为两大类&#xff1a; 比较类&#xff1a;通…

springboot奖助学金评审系统的设计与实现毕业设计源码031035

奖助学金评审系统的设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用…

③【Maven】创建Maven工程,解读核心配置。

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 创建Maven工程&#xff0c;解读核心配置。一、…

React render 的原理和触发时机

一、原理 在类组件和函数组件中&#xff0c;render函数的形式是不同的。 在类组件中render函数指的就是render方法&#xff1b;而在函数组件中&#xff0c;指的就是整个函数组件。 class Foo extends React.Component {render() { //类组件中return <h1> Foo </h1&…

CANoe的安装及打开

1. 安装 CANoe分为软件和硬件。硬件是一个盒子,可以连接真实ECU进行剩余仿真测试 软件需要安装使用,可以在Vector官方网站上下载软件包:https://www.vector.com/cn/zh/products/products-a-z/software/canoe/#c4327 我们以CANoe 15版本为例,下载后是压缩包 解压后,双击运…

结构(structure)创建——直接赋值法与使用struct函数创建法。

一些不同类型的数据组合成一个整体&#xff0c;虽然各个属性分别具有不同的数据类型&#xff0c;但是它们之间是密切相关的&#xff0c;结构&#xff08;(Structure&#xff09;类型就是包含一组记录的数据类型。结构类型的变量多种多样&#xff0c;可以是一维数组、二维数组或…

全面梳理Spring Boot框架的日志体系结构

文章目录1. Java 日志概览1.1 总体概览1.2 日志级别1.3 综合对比1.4 最佳实践2. Spring Boot 日志实现2.1 Spring Boot 日志配置2.2 Logback 配置2.3 Log4j 配置之前录过一个视频和大家分享 Spring Boot 日志问题&#xff0c;但是总感觉差点意思&#xff0c;因此松哥打算再通过…

第十八章 SPFA算法以及负环问题(利用dijkstra推导出该算法,超级详细!!)

第十八章 SPFA算法以及负环问题一、dijkstra算法的弊端二、dijkstra算法的优化1、SPFA算法&#xff08;1&#xff09;算法思路&#xff1a;&#xff08;2&#xff09;算法模板&#xff1a;问题&#xff1a;模板&#xff1a;逐行分析&#xff1a;三、SFPA解决负环问题&#xff1…

uni-clould常用笔记

一&#xff0c;云函数 定义&#xff1a; // hellocf云函数index.js入口文件代码 use strict; exports.main async (event, context) > {//event为客户端上传的参数let c event.a event.breturn {sum: c} // 通过return返回结果给客户端 }调用&#xff1a; // 客户端调…

【Linux】su 和 sudo 命令

su 命令 su 命令作用&#xff1a;在已登录的会话中切换到另外一个用户。 1、su root 切换超级用户root角色&#xff0c;但不切换用户环境。需要输入root角色的密码。 2、su - root 切换root角色&#xff0c;并切换用户环境。 sudo 命令 sudo 命令作用&#xff1a;暂时切…

【树莓派不吃灰】命令篇⑩ 记录Linux常用命令

目录1. 命令格式1.1 mount2. 文件处理命令2.1 ls2.2 mkdir2.3 cd2.4 pwd2.5 rmdir2.6 cp2.7 mv2.8 rm2.9 touch2.10 cat、tac2.11 more、less、head、tail2.12 ln3. 权限管理命令3.1 chmod3.2 chown3.3 chgrp3.4 umask4. 文件搜索命令4.1 find4.2 locate4.3 which4.4 whereis4.…

进阶 - Git的标签管理

本篇文章&#xff0c;是基于我自用Windows&#xff08;Win10&#xff09;系统当做示例演示 本地仓库在&#xff1a;E:\test_git_rep 远程仓库是&#xff1a;gitgithub.com:lili40342/test_git_rep.git 描述测试环境的目的&#xff0c;是更好的解释测试过程&#xff0c;以免对你…

elasticsearch-8.5.2快速入门和kibana-8.5.2的使用

一、 安装 官方安装Elasticsearch&#xff0c;和ES可视化工具kibana。安装下载过程略。 二、 启动Elasticsearch。 windows系统&#xff0c;直接进入到如图目录&#xff0c;然后启动elasticsearch.bat&#xff0c;这个就是ES服务。 启动后&#xff0c;我们可以访问https://…

#438 沸腾客厅:从数字藏品到Web3.0,不止于事件营销

点击文末“阅读原文”即可收听本期节目数字藏品是什么&#xff1f;数字藏品是指使用区块链技术&#xff0c;对应特定的作品、艺术品生成的唯一数字凭证&#xff0c;在保护其数字版权的基础上&#xff0c;实现真实可信的数字化发行、购买、收藏和使用。2022年是天津文化中心成立…

「Redis」10 三大缓存问题、分布式锁

笔记整理自【尚硅谷】Redis 6 入门到精通 超详细 教程 Redis——三大缓存问题、分布式锁 1. 三大缓存 缓存穿透 问题描述 key 对应的数据在数据源并不存在&#xff0c;每次针对此 key 的请求从缓存获取不到&#xff0c;请求都会压到数据源&#xff0c;从而可能压垮数据源。 …

Java入门教程(27)——重写和final关键字

文章目录1.重写(override)2.final关键字实例1&#xff1a;修饰变量实例2.修饰方法实例3.修饰类1.重写(override) 什么是重写呢&#xff0c;顾名思义&#xff0c;子类重写父类的方法&#xff0c;可以用自身行为替换父类行为。方法重写需要符合的条件&#xff1a; 方法名、形参列…

【Linux】静动态库的制作和使用

前言 好久不见&#xff0c;甚是想念~ 本篇文章具体以操作为主&#xff0c;介绍在Linux下如何打包动静态库&#xff0c;并且如何使用这些库&#xff0c;同时&#xff0c;简单的阐述一下原理。让我们开始吧~ 上一篇Linux文章传送地址~ 【Linux】基础IO的理解与操作 - fd_柒海啦的…

复合材料专场 | ABAQUS车载四型复合材料气瓶固化过程的数值模拟分析攻略

复合材料气瓶固化的热场本质上可以认为包含两个阶段&#xff0c;复合材料气瓶表面和周围通过与空气的热对流换热&#xff0c;复合材料与内部塑料芯模以及金属接头的传热。在第一个阶段整体温度较低&#xff0c;热量从表面向复合材料层内部流入&#xff0c;此时固化速率很低&…

Python使用Opencv图像处理方法完成手势识别(三)tkinter制作GUI界面

前面对手势识别已经差不多完成。 这一章来制作一个手势识别GUI界面和说一下精确度不够问题所在。 首先是精确度不够的问题&#xff1a; 让手势更规范&#xff0c;手掌张开点。首先应该调节Hsv阈值&#xff0c;因为手掌和环境颜色与我的可能有差异。调整面积&#xff0c;周长阈…