首页 > 其他分享 >Qt 项目实战:基于QMediaPlayer播放器

Qt 项目实战:基于QMediaPlayer播放器

时间:2024-02-19 14:13:30浏览次数:27  
标签:播放器 Widget Qt QMediaPlayer QAction popMenu new include

QMediaPlayer开发视频播放器

Q:我们为何不使用QMediaPlayer?

A:QMediaPlayer支持的编解码库太少;QMediaPlayer在windows中解码调用的是
DirectShow,在Linux中调用的是GStreamer;相对Windows而言GStreamer扩展编解
码库比较方便,但是windows中的DirectShow太老了,Demuxer Decoder都比较麻烦
较麻烦;
QtMultimediaDemo 这个例子为老师编写的基于QMediaPlayer的播放器,它可以播放
MPEG­4编码方式的视频

使用QMediaPlayer搭建最简单的播放器
step1:pro文件添加内容

QT += core gui multimedia multimediawidgets

step2:框架

step3:测试代码

 1 #include "widget.h"
 2 
 3 #include <QApplication>
 4 #include <QMediaPlayer>
 5 #include <QVideoWidget>
 6 #include <QDebug>
 7 
 8 int main(int argc, char *argv[])
 9 {
10     QApplication a(argc, argv);
11 
12     // 创建一个MediaPlayer
13     QMediaPlayer *player = new QMediaPlayer;
14 
15     // 创建一个播放器窗口(Widget),用于显示MediaPlayer
16     QVideoWidget *vw = new QVideoWidget;
17 
18     // 将player绑定到显示的窗口上
19     player->setVideoOutput(vw);
20 
21     // 打开播放器的位置
22     player->setSource(QUrl::fromLocalFile("G:/video_test/video-h265.mkv"));
23     vw->setGeometry(100,100,640,480);
24     vw->show();
25     //    Widget w;
26     //    w.show();
27     return a.exec();
28 }

不支持格式

如何添加不是“非基本图形控件”的派生类

需求: 需要在界面上直接拖一个 QVideoWidget,由于基本控件中没有QVideoWidget,所以需要想想办法

新建提升的类

 因为QVideoWidget本身就继承于QWidget,所以这里选择QWidget作为基类

控件进行提升

成功播放视频

widget.h

 1 #ifndef WIDGET_H
 2 #define WIDGET_H
 3 
 4 #include <QWidget>
 5 #include <QMediaPlayer>
 6 #include <QVideoWidget>
 7 #include <QMenu>
 8 #include <QFileDialog>
 9 #include <QFile>
10 #include <QDir>
11 
12 QT_BEGIN_NAMESPACE
13 namespace Ui { class Widget; }
14 QT_END_NAMESPACE
15 
16 class Widget : public QWidget
17 {
18     Q_OBJECT
19 
20 public:
21     Widget(QWidget *parent = nullptr);
22     ~Widget();
23 
24 protected:
25     virtual void contextMenuEvent(QContextMenuEvent *event);
26 
27 private:
28     void createRightPopActions();
29 
30 private slots:
31     void openLocalVideoSlot();
32     void openUrlVideoSlot();
33 
34 private:
35     Ui::Widget *ui;
36     QMenu *popMenu;               //右键弹出式菜单
37     QAction *openLocalAction;     //打开本地文件
38     QAction *openUrlAction;       //打开网络文件
39     QAction *fullScreenAction;    //全屏显示
40     QAction *normalScreenAction;  //普通显示
41     QAction *quitAction;          //退出
42 
43     QMediaPlayer *player;
44 
45 
46     //QVideoWidget* vw;    //不需要了,界面上已经拖了一个QVideoWidget进去了
47 };
48 #endif // WIDGET_H

widget.cpp

 1 #include "widget.h"
 2 #include "ui_widget.h"
 3 
 4 Widget::Widget(QWidget *parent) :
 5     QWidget(parent),
 6     ui(new Ui::Widget),
 7     player(new QMediaPlayer) //创建一个MediaPlayer
 8 {
 9     ui->setupUi(this);
10 
11     createRightPopActions();
12 
13     player->setVideoOutput(ui->av_widget); //把player绑定到显示窗口上
14 }
15 
16 /* 右键弹出 Menu & Action */
17 void Widget::createRightPopActions()
18 {
19     popMenu = new QMenu(this);
20     popMenu->setStyleSheet("background-color: rgb(100, 100, 100);");
21 
22     openLocalAction = new QAction(this);
23     openLocalAction->setText(QString("打开本地文件"));
24 
25     openUrlAction = new QAction(this);
26     openUrlAction->setText(QString("打开本地文件"));
27 
28     fullScreenAction = new QAction(this);
29     fullScreenAction->setText(QString("全屏"));
30 
31     normalScreenAction = new QAction(this);
32     normalScreenAction->setText(QString("普通"));
33 
34 
35     quitAction = new QAction(this);
36     quitAction->setText(QString("退出"));
37 
38     connect(openLocalAction, SIGNAL(triggered(bool)), this, SLOT(openLocalVideoSlot()));
39     connect(openUrlAction, SIGNAL(triggered(bool)), this, SLOT(openUrlVideoSlot()));
40     connect(fullScreenAction, &QAction::triggered, this, &Widget::showFullScreen);
41     connect(normalScreenAction, &QAction::triggered, this, &Widget::showNormal);
42     connect(quitAction, &QAction::triggered, this, &Widget::close);
43 }
44 
45 void Widget::openLocalVideoSlot()
46 {
47     QString file = QFileDialog::getOpenFileName(this, tr("Open file"),
48                                                 QDir::homePath(),
49                                                 tr("Multimedia files(*)"));
50 
51     if (file.isEmpty())
52         return;
53 
54     player->setSource(QUrl::fromLocalFile(file)); //设置需要打开的媒体文件
55 
56     player->play();
57 }
58 
59 void Widget::openUrlVideoSlot()
60 {
61 
62 }
63 
64 
65 
66 /*右键菜单接口*/
67 void Widget::contextMenuEvent(QContextMenuEvent *event)
68 {
69     Q_UNUSED(event);         //未使用不警告
70     popMenu->clear();
71 
72 
73     popMenu->addAction(openLocalAction);
74     popMenu->addAction(openUrlAction);
75     popMenu->addAction(fullScreenAction);
76     popMenu->addAction(normalScreenAction);
77     popMenu->addAction(quitAction);
78 
79     popMenu->exec(QCursor::pos());//QAction *exec(const QPoint &pos, QAction *at = Q_NULLPTR);
80 }
81 
82 
83 
84 Widget::~Widget()
85 {
86     delete ui;
87 }

无边框的视屏

 布局器边框都设置为zero,设置widget的背景颜色为666

标签:播放器,Widget,Qt,QMediaPlayer,QAction,popMenu,new,include
From: https://www.cnblogs.com/ybqjymy/p/18020952

相关文章

  • Qt 哈希加密 QCryptographicHash
    QCryptographicHash类提供了生成密码散列的方法。该类可以用于生成二进制或文本数据的加密散列值。目前支持MD4、MD5、SHA-1、SHA-224、SHA-256、SHA-384和SHA-512。共有类型枚举QCryptographicHash::Algorithm:公共函数voidaddData(constchar*data,intlength)......
  • Qt 项目实战:电子时钟
    电子时钟隐藏widget边框this->setWindowFlags(Qt::FramelessWindowHint);//隐藏边框实时跟踪鼠标this->setMouseTracking(true);//实时跟踪鼠标通过信号与槽来刷新时针分针秒针状态connect(timer,SIGNAL(timeout()),this,SLOT(update()));鼠标左键按下移动窗......
  • Qt 项目实战:MD5工具开发
    MD介绍MD5消息摘要算法(英语:MD5Message­DigestAlgorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hashvalue),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(RonaldLinnRivest)设计,于1992年公开,用以取代MD4算法。MD5应用编辑......
  • Qt 项目实战:幸运转盘
    幸运电子转盘基础绘图通过paintEvent来绘图鼠标事件:鼠标左键单击开始旋转Timer:定时器信号与槽1#ifndefWIDGET_H2#defineWIDGET_H34#include<QWidget>5#include<QEvent>6#include<QDebug>7#include<QTimer>8#include<QTime>9#include&l......
  • Qt 使用Http协议通信
    介绍使用QT进行应用开发时,有时候需要进行客户端和服务端的网络通信,网络通信常用的一种协议就是http协议。QT对http协议进行了封装,下面将介绍两种http通信方式的使用。在使用http时需要在pro文件中添加对应的模块。QT+=networkhttp主要两种通信方式为get和post......
  • electron delphi winform wpf qt的对比
    Electron、Delphi、WinForms、WPF和Qt都是用于开发桌面应用程序的工具或框架,它们各自有一些独特的优点和适用场景。以下是对这些工具的简要对比:Electron:基于Web技术(HTML、CSS和JavaScript)的跨平台桌面应用程序开发框架。使用Chromium渲染引擎提供强大的页面渲染能力。适用......
  • 如何用Qt实现一个无标题栏、半透明、置顶(悬浮)的窗口
    在Qt框架中,要实现一个无标题栏、半透明、置顶(悬浮)的窗口,需要一些特定的设置和技巧。废话不多说,下面我将以DrawClient软件为例,介绍一下实现这种效果的四个要点。要点一:移除标题栏(去除关闭、最小化、最大化按钮)在窗口的构造函数中设置窗口的样式,在强调一下,一定要找构造函数中设置,......
  • Qt实用技巧:QCustomPlot做北斗GPS显示绝对位置运动轨迹和相对位置运动轨迹图的时,使图按
    需求  使用QCustomPlot绘制多个目标的北斗运行轨迹图,包括累计绝对位置图和记录时刻的相对位置图。  当前绘制存在问题:    交付客户前,公司内部自测流程发现的问题。  实际预期效果为:   原因  QCustomPlot加入数据是按照x轴排列,也可以按照y轴排列,使用图层......
  • QT_linux
    加载本地图片/*QPixmap类型对象*/QPixmapimage;/*加载*/image.load(":/image/cd.png");//不缩放ui->label->setScaledContents(false);//图片在标签中居中显示(水平和垂直方向均居中)ui->label->setAlignment(Qt::AlignCenter);pixbad2(":/1/bad.png");......
  • QT打包
    Qt打包程序提示“应用程序无法正常启动(0xc000007b)”/未找到Qt5Core.dll的正确解决方案先打到配置环境变量的页面 ......