QT 自动 弹窗 视频 播放

本篇文章记录:qt 每隔一段时间自动弹出到屏幕最前端播放视频(视频自己配置路径),键盘上键代表开/关,下键代表进入循环播放


主ui (mainwindow.ui)里把下面自己创建的提示为窗口部件

mainwindow.h 不需要写,.cpp也可以不写,下面我写的是改变程序exe图标
#include "mainwindow.h"
#include "./ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    
    ui->setupUi(this);
    
    //ico  资源路径
    this->setWindowIcon(QIcon("://pp.ico"));
}

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

注意://pp.ico 是我自己添加的.exe图标文件,首先添加qrc文件然后把路径复制过来即可

创建一个新的ui 文件(video)实现视频的播放

video.h文件
#ifndef VIDEO_H
#define VIDEO_H

#include <QWidget>
#include <QtMultimedia>
#include <QVideoWidget>
#include <Windows.h>
#include <QTime>

#include <QDebug>
#include "../../PublicLibrary/config.h"

namespace Ui {
class Video;
}

class Video : public QWidget
{
    Q_OBJECT

public:
    explicit Video(QWidget *parent = nullptr);
    ~Video();


    bool isLoop;
    QTimer *tim;
    void MaxWindowFun();
    void MinWindowFun();
    config*con=nullptr;

public  slots:
   void SmediaStatusChanged(QMediaPlayer::MediaStatus status);

private:

    QVideoWidget    *       m_pPlayerWidget;
    QMediaPlayer    *       m_pPlayer;
    Ui::Video *ui;
    HHOOK keyboardHook;

public slots:
    void key_up();
    void key_down();


};



class keymonitor : public QObject
{
    Q_OBJECT
private:
    static keymonitor*m_keymonitor;


private:
   keymonitor()
   {

   }
public:
   ~keymonitor()
   {

   };
   static keymonitor*getinstance()
   {
       if(m_keymonitor==nullptr)
       {
           m_keymonitor=new keymonitor();
       }
       return m_keymonitor;
   };
   static LRESULT LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
   {
       KBDLLHOOKSTRUCT* ks = (KBDLLHOOKSTRUCT*)lParam;
       if (ks->flags == 128 || ks->flags == 129 /*|| ks->flags == 0*/)
       {
           if (ks->vkCode == 38)
           {
                emit keymonitor::getinstance()->winkey_up();
           }
           else if (ks->vkCode == 40)
           {
                emit keymonitor::getinstance()->winkey_down();
           }
       }
       return CallNextHookEx(NULL, nCode, wParam, lParam);
   };
signals:
    void winkey_up();
    void winkey_down();


};
#endif // VIDEO_H
video.cpp文件
#include "video.h"
#include "ui_video.h"


keymonitor* keymonitor::m_keymonitor = nullptr;

Video::Video(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Video)
{
    //配置文件初始化
    con=new config;
    ui->setupUi(this);


    setFocusPolicy(Qt::ClickFocus);
    isLoop=false;

    m_pPlayer = new QMediaPlayer;

    m_pPlayer->setSource(QUrl(con->videoPath));


    m_pPlayerWidget = new QVideoWidget;
    //播放视频
    m_pPlayer->setVideoOutput(m_pPlayerWidget);
    //开启音频
    m_pPlayer->setAudioOutput(new QAudioOutput());

    //添加视频在ui框中播放
    ui->verticalLayout->addWidget(m_pPlayerWidget);
    //填充背景色
    m_pPlayerWidget->setAutoFillBackground(true);
    QPalette qplte;
    qplte.setColor(QPalette::Window, QColor(0,0,0));
    m_pPlayerWidget->setPalette(qplte);



    //播放
    connect(keymonitor::getinstance(),SIGNAL(winkey_up()), this, SLOT(key_up()));
    //停止
    connect(keymonitor::getinstance(),SIGNAL(winkey_down()), this, SLOT(key_down()));
    //连接
    connect(m_pPlayer,SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)),this,SLOT(SmediaStatusChanged(QMediaPlayer::MediaStatus)));
    //播放
    m_pPlayer->play();
    //初始化勾子
    keyboardHook = 0;
    keyboardHook = SetWindowsHookEx(
        WH_KEYBOARD_LL,
        &keymonitor::LowLevelKeyboardProc,
        GetModuleHandleA(NULL),
        NULL
    );

    tim = new QTimer();



}



Video::~Video()
{
    delete m_pPlayer;
    delete m_pPlayerWidget;
    delete ui;
}
//最大窗口化
void Video::MaxWindowFun()
{
    this->parentWidget()->showFullScreen();
    this->activateWindow();
    this->setWindowState((this->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
    m_pPlayer->play();
}
//最小窗口化
void Video::MinWindowFun()
{
    m_pPlayer->stop();

    this->parentWidget()->showMinimized();
}

//窗口状态改变时进行开/关/循环判断
void Video::SmediaStatusChanged(QMediaPlayer::MediaStatus status)
{

    if(QMediaPlayer::EndOfMedia==status)
    {

        if(isLoop)
        {
            MinWindowFun();
            tim->setInterval(con->delayVideo);
            connect(tim,&QTimer::timeout,this,[=](){
                MaxWindowFun();
                tim->stop();
            });
            tim->start();
        }
        else
        {
            MinWindowFun();
        }
    }
}
//键盘上
void Video::key_up()
{
    if(this->parentWidget()->isMinimized())
    {
        MaxWindowFun();
        isLoop=false;

    }
    else if(this->parentWidget()->isFullScreen())
    {
        MinWindowFun();
    }
}

//键盘下
void Video::key_down()
{

  MaxWindowFun();
  isLoop=true;

}

创建config类文件,设置路径配置文件 config.h

#ifndef CONFIG_H
#define CONFIG_H

#include <QObject>


class config : public QObject
{
    Q_OBJECT

public:
    int delayVideo;
    QString videoPath;
    //json文件函数
    void  jsonFile();

    explicit config(QObject *parent = nullptr);
signals:

};

#endif // CONFIG_H
config.cpp
#include "config.h"



#include <QJsonDocument>
#include <QJsonParseError>
#include <QFile>
#include <QJsonObject>
#include <QDebug>
#include <QJsonArray>




config::config(QObject *parent)
    : QObject{parent}
{

    jsonFile();
}


void config::jsonFile()
{   
    //项目文件下创建配置文件
    QFile file("./configInfo.json");
    //如果不小删除了会自动生成此文件格式
    if(!file.open(QIODevice::ReadOnly))
    {

    QVariantHash Data;
    //播放路径
    Data.insert("Mp4_Path", "./1.mp4");
    //延迟时间
    Data.insert("Delay_time", 2000);

    QJsonObject rootObj = QJsonObject::fromVariantHash(Data);
    QJsonDocument document;
    document.setObject(rootObj);

    QByteArray byte_array = document.toJson(QJsonDocument::Compact);
    QString json_str(byte_array);
    //根据实际填写路径
    QFile file("./configInfo.json");

    if (!file.open(QIODevice::ReadWrite | QIODevice::Text))
    {
        qDebug() << "file error!";
    }
    QTextStream in(&file);
    in << json_str;
    file.close();   // 关闭file
    }

    QJsonParseError jerr;
    QJsonDocument doc = QJsonDocument::fromJson(file.readAll(), &jerr);
    QJsonObject jroot = doc.object();

    //读取文件
    delayVideo = jroot["Delay_time"].toInt();
    videoPath = jroot["Mp4_Path"].toString();


    qInfo()<<"shuchu"<<delayVideo<<"  "<<videoPath;

}

主函数main.cpp

#include "mainwindow.h"

#include <QApplication>

#include <QSharedMemory>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QSharedMemory shared_memory;
    
    //防止程序多启
    shared_memory.setKey(QString("666666"));//设置固定共享内存段的key值
    if(shared_memory.attach())   //尝试将进程附加到该共享内存段
    {
        return 0;
    }
    if(shared_memory.create(1)) //创建1byte的共享内存段
    {
        MainWindow w;
        w.activateWindow();
        w.setWindowState((w.windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);

        w.show();

        //w.resize(1920, 1080);
        w.showMaximized();
        w.showFullScreen();
        return a.exec();
    }


}

无聊记录一下写的垃圾代码,下载解压里面的exe可以运行看见效果

git 原文件路径 https://gitee.com/baibuchuanyang-123/qt.git

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值