当前位置: 首页 > news >正文

Qt视频播放器

  • 一、设置好ui界面
  • 二、打开文件槽函数
    • 1.QDir::homePath()作用介绍
    • 2.QFileDialog::getOpenFileName()介绍
    • 3.QFileInfo介绍
    • 4.player 指针解释
    • 5.打开文件槽函数完整代码
  • 三、视频播放器初始化
    • 1.QMediaPlayer()函数
    • 2.设置时间间隔的作用
    • 3. QGraphicsScene介绍
    • 4.QGraphicsVideoItem介绍
    • 5.设置视频输出
    • 6.完整代码

一、设置好ui界面

在这里插入图片描述

二、打开文件槽函数

这段代码是一个槽函数,用于响应名为"pushButton_open"的按钮的点击事件。当用户点击该按钮时,会弹出一个文件选择对话框,用户可以选择一个视频文件。

1.QDir::homePath()作用介绍

QString strCurrentPath=QDir::homePath();

QDir::homePath()是Qt框架中的一个静态函数,主要用于获取当前系统用户的主目录路径。

主目录是每个用户在系统中的个人目录,通常包含用户的文档、下载、图片等文件夹。在不同的操作系统上,主目录的路径可能会有所不同。使用QDir::homePath()函数可以方便地获取当前用户主目录的路径,以便后续在该目录下进行文件操作或者设置默认路径。

在给定的代码中,QDir::homePath()函数被用于获取当前系统用户的主目录路径,并将其作为默认的打开文件对话框的初始路径,以方便用户在用户主目录下浏览和选择视频文件。

总之,QDir::homePath()的作用是返回当前系统用户的主目录路径,便于在程序中定位和处理与用户相关的文件。
在这里插入图片描述
为了返回主目录之后,点击打开文件跳转到该目录。

QString strDlgTitle="请选择视频文件";//打开文件对话框标题名称

在这里插入图片描述

QString strFilter="MP4 Files(*.mp4);;ALL Files(*.*)";//打开视频文件过滤器

在这里插入图片描述

QString strAllFiles=QFileDialog::getOpenFileName(this,strDlgTitle,strCurrentPath,strFilter);

QFileDialog::getOpenFileName()是一个静态函数,它显示一个打开文件对话框,并返回用户选择的文件路径。

2.QFileDialog::getOpenFileName()介绍

该函数的原型如下:

QString QFileDialog::getOpenFileName(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = QFileDialog::Options())

参数说明:

  • parent:可选参数,指定对话框的父窗口。
  • caption:可选参数,指定对话框的标题。
  • dir:可选参数,指定对话框中打开的文件夹路径。
  • filter:可选参数,指定文件过滤器,用于筛选可显示的文件类型。
  • selectedFilter:可选参数,返回用户选择的文件过滤器。
  • options:可选参数,指定对话框的选项。

函数返回值是一个QString,表示用户选择的文件路径。如果用户取消了选择或者发生了错误,将返回一个空字符串。

在给定的代码中,使用QFileDialog::getOpenFileName()实现了打开文件对话框并获取用户选择的视频文件路径。函数的参数依次为父窗口指针(this),对话框标题(“请选择视频文件”),默认打开的文件夹路径(当前系统目录),文件过滤器(“MP4 Files(.mp4);;ALL Files(.*)”),其余参数使用默认值。函数返回的用户选择的文件路径将存储在strAllFiles`中供后续使用。

总而言之,QFileDialog::getOpenFileName()是一个方便的函数,用于显示文件选择对话框并获取用户选择的文件路径。

3.QFileInfo介绍

 QFileInfo FileInfo(strAllFiles);//获取文件信息ui->label->setText(FileInfo.fileName());

QFileInfo是Qt框架中的一个类,用于获取和操作文件的元信息。

在给定的代码中,QFileInfo的构造函数被用于创建一个QFileInfo对象。构造函数的参数是指定要获取元信息的文件路径,这里使用了变量strAllFiles,该变量应该是之前通过QFileDialog::getOpenFileName()函数获取到的用户选择的文件路径。

通过创建QFileInfo对象,可以方便地获取各种与文件相关的信息,如文件名、文件路径、文件大小、文件创建时间等等。使用QFileInfo对象,可以对文件进行操作并获取其属性。
根据给定的代码,ui->label 是一个指向用户界面中的标签控件的指针。setText()QLabel 类的一个槽函数,用于设置标签控件的文本内容。

在这段代码中,FileInfo.fileName() 用于获取 QFileInfo 对象 FileInfo 中的文件名,然后使用 setText() 将该文件名设置为标签控件 ui->label 的文本内容。

这样,通过以上代码,标签控件的文本内容就会被设置为选择的文件的文件名。

需要注意的是,在执行这段代码之前,需要确保 FileInfo 对象已创建,并且 strAllFiles 变量中存储的是一个有效的文件路径。否则,可能会导致 FileInfo 对象未初始化的错误,或者显示错误的文件名。

4.player 指针解释

player->setMedia(QUrl::fromLocalFile(strAllFiles));
player->play();

在给定的代码中,player 是一个指向媒体播放器对象的指针,通过调用 setMedia() 函数来设置要播放的媒体文件。

setMedia() 函数的参数是 QUrl 类型的对象,可以使用 QUrl::fromLocalFile() 函数将本地文件路径转换成合适的 QUrl 对象。在这里,使用 strAllFiles 变量作为本地文件路径,通过 QUrl::fromLocalFile() 转换成 QUrl 对象。

接下来,调用 player 对象的 play() 函数来开始播放媒体文件。

在这段代码中,假设 player 是一个有效的媒体播放器对象,并且 strAllFiles 存储的是一个有效的本地文件路径。如果文件路径无效或播放器对象未正确初始化,可能会导致播放操作失败。

请确保在执行此代码之前,先创建并初始化了媒体播放器对象,同时检查 strAllFiles 的值是否是一个有效的本地文件路径。

5.打开文件槽函数完整代码


void MainDialog::on_pushButton_open_clicked()
{QString strCurrentPath=QDir::homePath();//获取当前系统目录QString strDlgTitle="请选择视频文件";//打开文件对话框标题名称QString strFilter="MP4 Files(*.mp4);;ALL Files(*.*)";//打开视频文件过滤器QString strAllFiles=QFileDialog::getOpenFileName(this,strDlgTitle,strCurrentPath,strFilter);//QMessageBox::information(this,"提示",strAllFiles,QMessageBox::Yes|QMessageBox::No);//提示if(strAllFiles.isEmpty()){QMessageBox::information(this,"错误","打开视频文件失败,请重新检查",QMessageBox::Yes);return;}QFileInfo FileInfo(strAllFiles);//获取文件信息ui->label->setText(FileInfo.fileName());player->setMedia(QUrl::fromLocalFile(strAllFiles));player->play();
}

三、视频播放器初始化

1.QMediaPlayer()函数

在给定的代码中,player=new QMediaPlayer(this); 实例化了一个 QMediaPlayer 对象,并将其指针赋值给 player

通过 new 运算符创建了一个新的 QMediaPlayer 对象,并将其父对象设置为 this,这意味着 player 对象将成为当前对象的子对象。

QMediaPlayer 是 Qt 框架中用于播放音频和视频的类,它提供了许多功能和方法来控制媒体播放,包括播放、暂停、停止等。

在此代码中,我们创建了一个新的 QMediaPlayer 对象并将其分配给指针 player,以便进一步使用该对象进行媒体播放操作。

需要注意的是,在使用 player 对象之前,需要确保已正确初始化它,并在适当的时候进行媒体文件的设置和播放操作。

2.设置时间间隔的作用

player->setNotifyInterval(2000);//设置播放间隔

setNotifyInterval()QMediaPlayer 类中的一个函数,用于设置通知间隔时间。通知间隔是指播放器发送 positionChanged() 信号的时间间隔。

在给定的代码中,player->setNotifyInterval(2000) 将通知间隔设置为 2000 毫秒,即每隔 2000 毫秒播放器会发送一次 positionChanged() 信号。

positionChanged() 信号在每次播放位置改变时触发,可以用于实时更新播放进度或执行其他与播放位置相关的操作。

请注意,在执行此代码之前,需要确保 player 是有效的 QMediaPlayer 对象。通知间隔的时间可以根据需要进行调整。

3. QGraphicsScene介绍

   QGraphicsScene *sence=new QGraphicsScene(this);ui->graphicsView->setScene(sence);

在给定的代码中,首先通过 new 运算符创建了一个 QGraphicsScene 对象的指针 sence,并将其父对象设置为 this

QGraphicsScene 是 Qt 框架中用于管理绘图项的场景类。它提供了一种组织和管理可视化元素的方式,可以在其中添加和移除绘图项,并进行各种操作和处理。

接下来,通过 ui->graphicsView->setScene(sence); 将创建的 QGraphicsScene 设置为 ui->graphicsView 控件的场景。这样就将场景与图形视图关联起来,从而可以在图形视图中显示场景中的绘图项。

4.QGraphicsVideoItem介绍

videoitem=new QGraphicsVideoItem;videoitem->setSize(QSize(ui->graphicsView->width(),ui->graphicsView->height()));videoitem->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsPathItem::ItemIsSelectable|QGraphicsItem::ItemIsFocusable);

在给定的代码中,首先创建了一个 QGraphicsVideoItem 对象的指针 videoitem

QGraphicsVideoItem 是 Qt 框架中的一个图形项类,用于在场景中显示视频。它继承自 QGraphicsObject 类,并提供了特定于视频的功能。

接下来,通过 videoitem->setSize(QSize(ui->graphicsView->width(),ui->graphicsView->height()))videoitem 的大小设置为和 ui->graphicsView 控件的大小相同。这样可以确保视频项的大小与图形视图匹配。

然后,通过 videoitem->setFlags() 设置了 videoitem 的标志。在给定的代码中,将其设置为可移动、可选择和可获得焦点。这些标志指定了可以对视频项执行的操作,例如拖动、选择、获取焦点等。

需要注意的是,QGraphicsVideoItem 类具有一组默认的标志,因此根据需要设置的标志可以是默认的或不同的。

总结起来,这部分代码创建了一个 QGraphicsVideoItem 对象,并设置了其大小和标志。通过设置正确的大小和标志,可以在图形视图中正确显示和操作视频项。

5.设置视频输出

sence->addItem(videoitem);
player->setVideoOutput(videoitem);

在给定的代码中,sence->addItem(videoitem) 将创建的 videoitem 添加到之前创建的 sence 场景中。这样,视频项将成为场景中的一个绘图项,可以在图形视图中显示。

addItem() 函数用于将绘图项添加到场景中。通过调用 sence->addItem(videoitem),我们将视频项添加到场景中,使其成为场景的一部分。

接下来,player->setVideoOutput(videoitem)videoitem 设置为播放器 player 的视频输出。这意味着,通过设置视频输出,我们将视频内容传递给 videoitem,从而使视频在图形视图中显示。

setVideoOutput()QMediaPlayer 类中的一个函数,用于设置视频输出。通过将 videoitem 作为参数传递给 setVideoOutput(),我们告诉播放器将视频内容输出给 videoitem,以在图形视图中显示。

综上所述,这部分代码将视频项添加到场景中,并将其设置为播放器的视频输出,从而实现了将视频显示在图形视图中的目的。

6.完整代码

MainDialog::MainDialog(QWidget *parent): QDialog(parent), ui(new Ui::MainDialog)
{ui->setupUi(this);//固定窗口尺寸(以用户设计窗口为准)setFixedSize(width(),height());//创建场景//视频播放器的初始化player=new QMediaPlayer(this);player->setNotifyInterval(2000);//设置播放间隔//创建播放场景QGraphicsScene *sence=new QGraphicsScene(this);ui->graphicsView->setScene(sence);videoitem=new QGraphicsVideoItem;videoitem->setSize(QSize(ui->graphicsView->width(),ui->graphicsView->height()));videoitem->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsPathItem::ItemIsSelectable|QGraphicsItem::ItemIsFocusable);sence->addItem(videoitem);player->setVideoOutput(videoitem);
}

相关文章:

Qt视频播放器

一、设置好ui界面二、打开文件槽函数1.QDir::homePath()作用介绍2.QFileDialog::getOpenFileName()介绍3.QFileInfo介绍4.player 指针解释5.打开文件槽函数完整代码 三、视频播放器初始化1.QMediaPlayer()函数2.设置时间间隔的作用3. QGraphicsScene介绍4.QGraphicsVideoItem介…...

Stable Diffusion教程(8) - X/Y/Z 图表使用

1. 介绍 这项功能可以在 文生图/图生图 界面的左下角种 “脚本” 一栏内选择 “X/Y/Z 图表” 以启用。 它创建具有不同参数的图像网格。使用 X 类型和 Y 类型字段选择应由行和列共享的参数,并将这些参数以逗号分隔输入 X 值 / Y 值字段。支持整数、浮点数和范围。…...

Android 获取网关 ip 和 DNS ip

参考下方 PingUtil.java 代码 import android.content.Context; import android.net.DhcpInfo; import android.net.wifi.WifiManager; import android.text.format.Formatter;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; impor…...

Docker root用户的pip使用方法

Docker下root用户 pip install XX 显示pip命令不存在 # 原始目标:pip install XX pip install --root-user-actionignore 【XX】# (要安装的包)参考:WARNING: Running pip as the ‘root‘ user can result in broken permissions Linux 中 root 与 su…...

企业新片场排名如何优化

企业新片场排名如何优化 要如何去做关键SEO?第一个我们要做的就是做好 SEO 关键词的选词,一般就是会有第一个常用的选词方法,第一是以常用的提问词去做,不实像是情人节买什么礼物,母亲节买什么礼物, 618 有…...

Database Name

概述 DB_NAME与INSTANCE_NAME DB_NAME 数据库名称,也就是数据库的名字标示。这里,数据库里可能有多个实例,比如RAC里的多节点,这多个节点是不同的实例,但是却有相同的名字,他们的 DB_NAME是相同的&#xf…...

git代码版本管理

git 文章目录 git基本使用 基本使用 在一台新的电脑上使用git 你要下载安装git, 然后把git的安装路径配到系统环境变量里 然后把这台电脑的.ssh/ id_rsa.pub里的公钥整到github里 然后在github上新建仓库,它会生成一些指令引导上你传本地的代码 之后就可以在终…...

k8s概念-ConfigMap

回到目录 一般用于去存储 Pod 中应用所需的一些配置信息,或者环境变量,将配置于 Pod 分开,避免应为修改配置导致还需要重新构建 镜像与容器。 1 创建ConfigMap #使用 kubectl create configmap -h 查看示例,构建 configmap 对象…...

Mybatis 实体类属性名和表中字段名不一致怎么处理

一. 前言 最近耀哥有学生出去面试,被问到 “Mybatis实体类的属性名和表中的字段名不一致该怎么处理?”,这其实是一个很经典的面试题,接下来耀哥就为大家详细解析一下这道面试题。 二. 分析 2.1 实体类和字段名不一致所带来的后果…...

CAS - 从AtomicInteger窥探CAS

Unsafe类是CAS的核心,由于Java方法无法直接访问底层,需要通过本地方法(native)来实现,Unsafe类相当于一个桥梁。基于Unsafe类,可以直接操作特定的内存数据。 我们从上一篇说CAS基本原理的时候,有说到一个“资源”被100…...

micro-ros IMU ML 代码

示例代码&#xff1a; #include <micro_ros_arduino.h>#include "LSM6DSOXSensor.h" #include "lsm6dsox_activity_recognition_for_mobile.h"#include <stdio.h> #include <rcl/rcl.h> #include <rcl/error_handling.h> #inclu…...

二十三种设计模式第二十四篇--访问者模式(完结撒花)

在访问者模式&#xff08;Visitor Pattern&#xff09;中&#xff0c;我们使用了一个访问者类&#xff0c;它改变了元素类的执行算法。 通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变。 这种类型的设计模式属于行为型模式。根据模式&#xff0c;元素对象已接…...

月报总结|Moonbeam 7月份大事一览

炎炎夏日&#xff0c;Moonbeam于越南举办了线下交流会&#xff0c;在EthCC 2023和以太坊社区成员共同讨论多链应用&#xff0c;在Polkadot Decoded中分享了Moonbeam的与众不同之处。 Bear Necessities Hackathon也于本月圆满结束&#xff0c;选出了每个赛道最杰出的项目&#…...

【2023.8】docker一键部署wvp-GB28181-pro和ZLMediaKit过程全记录

安装docker 使用的操作系统是ubuntu20.04 如何在 Ubuntu 20.04 上安装和使用 Docker https://developer.aliyun.com/article/762674 docker拉取配置好的ZLMediaKIt和wvp-GB28181-pro docker pull 648540858/wvp_pro第一次运行 docker一键运行ZLMediaKIt和wvp-GB28181-pro …...

【2023】字节跳动 10 日心动计划——第四关

目录 1. 买卖股票的最佳时机2. 打家劫舍 II 1. 买卖股票的最佳时机 &#x1f517; 原题链接&#xff1a;121. 买卖股票的最佳时机 假设在第 i i i 天卖出股票可获得最大利润&#xff0c;那么买入股票必然是在前 i − 1 i-1 i−1 天中的某一天。更进一步&#xff0c;买入股票应…...

数据库与数据仓库的区别及关系

数据库与数据仓库的区别及关系 数据库数据仓库异同差异联系例子 数据库 数据库是结构化信息或数据的有序集合&#xff0c;一般以电子形式存储在计算机系统中。通常由数据库管理系统 (DBMS) 来控制。它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集…...

Emacs之设置行号前景颜色(字体颜色)/背景颜色/光标颜色/背景透明度(一百二十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

【hive经典指标,离线数仓指标,ADS层指标分析】最近7日内连续3日下单用户数

1.建表语句 DROP TABLE IF EXISTS ads_order_continuously_user_count; CREATE EXTERNAL TABLE ads_order_continuously_user_count (dt STRING COMMENT 统计日期,recent_days BIGINT COMMENT 最近天数,7:最近7天,order_continu…...

线上java程序CPU及内存占用过高问题排查总结

背景 最近发现线上的一个JAVA程序总是过段时间慢慢卡死&#xff0c;最后导致无法提供服务&#xff0c;外部请求接口超时。 经排查发现&#xff0c;该程序CPU及内存占用都很高&#xff0c;导致整个系统负载很高。 到这里&#xff0c;就想到了对程序内存进行分析。排查过程 查询…...

c高级:day3

作业: 1. 整理思维导图 2.判断家目录下,普通文件的个数和目录文件的个数 #!/bin/bash ######################################################################## # File Name: zy1.sh # Created Time: 2023年08月04日 星期五 19时13分08秒 ##############################…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...