【Qt】文件与音视频

目录

一、输入输出设备类

二、文件读写类

三、文件和目录信息类

四、音视频

4.1 音频

4.2 视频


文件操作是应用程序必不可少的部分。Qt作为一个通用开发库,提供了跨平台的文件操作能力。Qt提供了很多关于文件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件复制或重命名等

一、输入输出设备类

在Qt中,文件读写的类为QFile。QFile的父类为QFileDevice,QFileDevice提供了文件交互操作的底层功能。QFileDevice的父类是QIODevice,QIODevice的父类为QObject

QIODevice是Qt中所有输入输出设备(input/output device,简称 I/O 设备)的基础类,I/O 设备就是能进行数据输入和输出的设备,例如文件是一种 I/O 设备,网络通信中的 socket 是 I/O 设备,串口、蓝牙等通信接口也是 I/O 设备,它们也是从 QIODevice 继承来的

Qt中主要的一些 I/O 设备类的继承关系如下图所示:

  • QFile是用于文件操作和文件数据读写的类,使用 QFile 可以读写任意格式的文件
  • QSaveFile是用于安全保存文件的类。使用 QSaveFile 保存文件时,会先把数据写入一个临时文件,成功提交后才将数据写入最终的文件。若保存过程中出现错误,临时文件里的数据不会被写入最终文件,这样就能确保最终文件中不会丢失数据或被写入部分数据。在保存较大的文件或复杂格式的文件时可以使用该类,如从网络上下载文件等
  • QTemporaryFile 是用于创建临时文件的类。使用函数 QTemporaryFile::open() 就能创建一个文件名唯一的临时文件,在 QTemporaryFile 对象被删除时,临时文件被自动删除
  • QTcpSocket 和 QUdpSocket 是分别实现了 TCP 和 UDP 的类
  • QSerialPort 是实现了串口通信的类,通过这个类可以实现计算机与串口设备的通信
  • QBluetoothSocket是用于蓝牙通信的类。手机和平板计算机等移动设备有蓝牙通信模块,笔记本电脑一般也有蓝牙通信模块。通过QBluetoothSocket类,就可以编写蓝牙通信程序。如编程实现笔记本电脑与手机的蓝牙通信
  • QProcess类用于启动外部程序,并且可以给程序传递参数
  • QBuffer以一个QByteArray对象作为数据缓冲区,将QByteArray对象当作一个I/O设备来读写

二、文件读写类

在Qt中,文件的读写主要是通过QFile类来实现。在QFile类中提供了一些用来读写文件的方法

对于文件的操作主要有:

  • 读数据:QFile类中提供了多个方法用于读取文件内容;如read()、readAll()、readLine()等
  • 写数据:QFile类中提供了多个方法用于往文件中写内容;如write()、writeData()等
  • 关闭文件:文件使用结束后必须用函数close()关闭文件

访问一个设备前,需要使用open()函数打开该设备,而且必须指定正确的打开模式,QIODevice中所有的打开模式由QIODevice::OpenMode枚举变量定义,其取值如下:

QIODevice::NotOpen没有打开设备
QIODevice::ReadOnly以只读方式打开设备
QIODevice::WriteOnly以只写方式打开设备
QIODevice::ReadWrite以读写方式打开设备
QIODevice::Append以追加方式打开设备,将数据写到文件末尾
QIODevice::Truncate每次打开文件后重写文件内容,原内容将被删除
QIODevice::Text

读文件时,行尾终止符会转换为'\n'

写文件时,行尾终止符会被转换为本地编码。如Win32上为'\r\n'

QIODevice::Unbuffered无缓冲形式打开文件,绕过设备中的任何缓冲区
QIODevice::NewOnly文件存在则打开失败,不存在则创建文件

代码示例:简易记事本

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QMenuBar>
#include <QPlainTextEdit>
#include <QFileDialog>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void handleAction1();void handleAction2();private:Ui::MainWindow *ui;QPlainTextEdit* edit;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowTitle("简易记事本");resize(1200, 1000);QMenuBar* menubar = menuBar();setMenuBar(menubar);QMenu* menu1 = new QMenu("文件");QMenu* menu2 = new QMenu("编辑");QMenu* menu3 = new QMenu("查看");menubar->addMenu(menu1);menubar->addMenu(menu2);menubar->addMenu(menu3);QAction* action1 = new QAction("打开");QAction* action2 = new QAction("保存");menu1->addAction(action1);menu1->addAction(action2);QFont font;font.setPixelSize(25);edit = new QPlainTextEdit();edit->setFont(font);setCentralWidget(edit);connect(action1, &QAction::triggered, this, &MainWindow::handleAction1);connect(action2, &QAction::triggered, this, &MainWindow::handleAction2);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::handleAction1()
{//弹出打开文件的对话框QString path = QFileDialog::getOpenFileName();//将文件路径显示到状态栏QStatusBar* statusbar = statusBar();statusbar->showMessage(path);//构造QFile对象,打开文件QFile file(path);bool ret = file.open(QIODevice::ReadOnly);if(!ret) statusbar->showMessage(path + "打开失败");//读取文件QString text = file.readAll();//关闭文件file.close();//将读取的内容设置到文本框中edit->setPlainText(text);
}void MainWindow::handleAction2()
{//弹出保存文件的对话框QString path = QFileDialog::getSaveFileName();//将文件路径显示到状态栏QStatusBar* statusbar = statusBar();statusbar->showMessage(path);//构造QFile对象,打开文件QFile file(path);bool ret = file.open(QIODevice::WriteOnly);if(!ret) statusbar->showMessage(path + "打开失败");//写文件const QString& text = edit->toPlainText();file.write(text.toUtf8());//关闭文件file.close();
}

三、文件和目录信息类

QFileInfo是Qt提供的一个用于获取文件和目录信息的类,如获取文件名、文件大小、文件修改日期等。QFileInfo类中提供了很多的方法,常用的有:

  • isDir()        检查该文件是否是目录
  • isExecutable()        检查该文件是否是可执行文件
  • fileName()        获得文件名
  • completeBaseName()        获取完整的文件名
  • suffix()        获取文件后缀名
  • completeSuffix()        获取完整的文件后缀
  • size()        获取文件大小
  • isFile()        判断是否为文件
  • fileTime()        获取文件创建时间、修改时间、最近访问时间等

代码示例:查看文件信息

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QFileInfo>
#include <QFileDialog>
#include <QDateTime>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* button = new QPushButton("按钮", this);connect(button, &QPushButton::clicked, [=]() {QString path = QFileDialog::getOpenFileName(this, "查看文件信息", "./");QFileInfo fileinfo(path);//文件名qDebug() << "文件名为:" << fileinfo.fileName().toUtf8().data();//文件后缀名qDebug() << "后缀名为:" << fileinfo.suffix().toUtf8().data();//文件大小qDebug() << "文件大小为:" << fileinfo.size();//文件路径qDebug() << "文件路径为:" << fileinfo.path().toUtf8().data();//判断是否为⽂件qDebug() << "是否为文件:"<< fileinfo.isFile();//文件创建时间QDateTime time1 = fileinfo.fileTime(QFileDevice::FileBirthTime);qDebug() << "创建时间为:" << time1.toString("yyyy-MM-dd hh:mm:ss").toUtf8().data();//文件的最后修改⽇期QDateTime time2 = fileinfo.lastModified();qDebug() << "最后修改时间为:"<< time2.toString("yyyy-MM-dd hh:mm:ss").toUtf8().data();//判断是否为文件夹qDebug() << "是否为目录:" << fileinfo.isDir();});
}Widget::~Widget()
{delete ui;
}

四、音视频

4.1 音频

在 Qt 中,音频主要是通过 QSound 类来实现。但是需要注意的是 QSound 类只支持播放 wav 格式的音频文件。即想要添加音频效果,先需要将非 wav 格式的音频文件转换为 wav 格式

注意:使用 QSound 类时,需要添加模块multimedia

核心API:play()        开始或继续播放当前源

代码示例

#include "widget.h"
#include "ui_widget.h"
#include <QSound>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QSound* sound = new QSound(":/BackButtonSound.wav", this);connect(ui->pushButton, &QPushButton::clicked, this, [=]() {sound->play();});
}
Widget::~Widget()
{delete ui;
}

4.2 视频

在 Qt 中,视频播放的功能主要是通过 QMediaPlayer类 和 QVideoWidget类 来实现。在使用这两个类时要添加对应的模块 multimedia 和 multimediawidgets

代码示例

QVideo.pro

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QHBoxLayout> //⽔平布局
#include <QVBoxLayout> //垂直布局
#include <QVideoWidget> //显⽰视频
#include <QMediaPlayer> //播放声⾳
#include <QPushButton> //按钮
#include <QStyle> //设置图标
#include <QFileDialog> //选择⽂件/⽂件夹QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void chooseVideo();private:Ui::Widget *ui;QMediaPlayer *mediaPlayer;QVideoWidget *videoWidget;QVBoxLayout *vbox;QPushButton *chooseBtn,*playBtn;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//对象实例化mediaPlayer = new QMediaPlayer(this);videoWidget = new QVideoWidget(this);//设置播放画⾯的窗⼝videoWidget->setMinimumSize(600,600);//实例化窗⼝布局---垂直布局this->vbox = new QVBoxLayout(this);this->setLayout(this->vbox);//实例化选择视频按钮chooseBtn = new QPushButton("选择视频",this);//实例化播放按钮playBtn = new QPushButton(this);//设置图标playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaPlay));//实例化⼀个⽔平布局,将按钮放⼊⽔平布局中QHBoxLayout *hbox = new QHBoxLayout;//添加控件hbox->addWidget(chooseBtn);hbox->addWidget(playBtn);//将播放窗⼝和⽔平布局都添加到垂直布局中vbox->addWidget(videoWidget);vbox->addLayout(hbox);//将选择视频对应的按钮和槽函数进⾏关联connect(chooseBtn,&QPushButton::clicked,this,&Widget::chooseVideo);
}Widget::~Widget()
{delete ui;
}void Widget::chooseVideo()
{//选择视频,返回⼀个播放视频的名字QString name = QFileDialog::getSaveFileName(this, "选择视频", ".", "MP4(*.mp4)");//设置媒体源mediaPlayer->setMedia(QUrl(name));//将视频输出附加到媒体播放器上mediaPlayer->setVideoOutput(videoWidget);//播放mediaPlayer->play();
}

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

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

相关文章

杂谈 EV之我见

每周至少更新一片博文&#xff0c;没有目的的看代码是没有效率的&#xff0c;带着目的去看代码才会有所得&#xff0c; 目前车载行业火爆&#xff0c;得益于EV和AI技术的发展&#xff0c;汽车从一个传统工业产品&#xff0c;摇身一变成为了前沿科技产品。 小米su7的发布会我看…

LeetCode刷题之94.二叉树中序遍历

文章目录 1. 描述2. 分析2.1 递归方法2.2 迭代 3. 解答3.1 递归3.2 迭代 1. 描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;ro…

C++ //练习 12.3 StrBlob需要const版本的push_back和pop_back吗?如果需要,添加进去。否则,解释为什么不需要。

C Primer&#xff08;第5版&#xff09; 练习 12.3 练习 12.3 StrBlob需要const版本的push_back和pop_back吗&#xff1f;如果需要&#xff0c;添加进去。否则&#xff0c;解释为什么不需要。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1…

浏览器工作原理与实践--页面性能:如何系统地优化页面

在前面几篇文章中&#xff0c;我们分析了页面加载和DOM生成&#xff0c;讨论了JavaScript和CSS是如何影响到DOM生成的&#xff0c;还结合渲染流水线来讲解了分层和合成机制&#xff0c;同时在这些文章里面&#xff0c;我们还穿插说明了很多优化页面性能的最佳实践策略。通过这些…

【C语言】扫雷小游戏

文章目录 前言一、游戏玩法二、创建文件test.c文件menu()——打印菜单game()——调用功能函数&#xff0c;游戏的实现main()主函数 game.c文件初始化棋盘打印棋盘随机布置雷的位置统计周围雷的个数展开周围一片没有雷的区域计算已排查位置的个数排查雷(包括检测输赢): game.h文…

【剪映专业版】04全局设置

视频课程&#xff1a;B站有知公开课【剪映电脑版教程】 设置-全局设置 草稿 草稿位置&#xff1a;非系统盘&#xff08;C盘&#xff09; 素材下载位置与 缓存管理&#xff1a;如果下载素材较多&#xff0c;需要定期删除缓存 预设保存位置&#xff1a;非系统盘&#xff08;C盘&a…

JavaScript exec、test和eval方法的使用

一、exec() 1.概述&#xff1a; exec()方法测试字符串中的匹配项。该方法是通用的匹配模式。如果找到匹配项&#xff0c;则返回结果数组&#xff0c;否则返回 null。 2.语法 /*** exec方法说明* param {String} string 必需。要搜索的字符串。* return {Array||Object} r…

动手学深度学习-关于y.sum().backward()中sum的理解

一、原文出处 2.5.2. 非标量变量的反向传播 当y不是标量时&#xff0c;向量y关于向量x的导数的最自然解释是一个矩阵。 对于高阶和高维的y和x&#xff0c;求导的结果可以是一个高阶张量。 然而&#xff0c;虽然这些更奇特的对象确实出现在高级机器学习中&#xff08;包括深度学…

基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离的企业级微服务多租户系统架构

简介 基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离的企业级微服务多租户系统架构。并引入组件化的思想实现高内聚低耦合并且高度可配置化&#xff0c;适合学习和企业中使用。 真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案&#x…

C语言操作符详解(二)

一、位操作符 & 按位与 | 按位或 ^ 按位异或 ~ 按位取反 注意&#xff1a;它们的操作数必须是整数。 下面的码我都只取了后八位 1.1、按位与 使用补码进行按位与 规则:对应二进制位有0就是0,两个同时为1才为1. 1.2、按位或 使用补码进行按位或 规则:对应二进…

GESP C++六级认证真题 2024年3月

C 六级 2024 年 03 月 1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 在构建哈夫曼树时&#xff0c;每次应该选择&#xff08; &#xff09;合并。 A. 最小权值的节点 B. 最大权值的节点 C. 随机节点 D. 深度最深的节点 第 2 题 面向对象的编程思想主…

【攻防世界】Web_python_template_injection

{{}}是变量包裹标识符&#xff0c;里面存放的是一个变量&#xff0c;当你输入 http://61.147.171.105:55121/{{8*8}} 执行成功&#xff0c;说明存在模版注入。接下来&#xff0c;开始想办法编代码拿到服务器的控制台权限 。 首先&#xff0c;题目告诉我们这是一个 python 注入…

2024年教师资格考试真题及答案1

一、选择题 11.刚被学校领导批评过的宋老师郁闷地走进教室&#xff0c;看见几个学生在大声喧哗&#xff0c;便不分青红皂白地将他们训斥了一番。该做法体现了宋老师&#xff08;&#xff09;。 A.不能平等待生 B.不能调适自我 C.不能严慈相济 D.不能有教无类 答案&#x…

SysTick滴答定时器 - 延时函数

SysTick定时器 Systick定时器&#xff0c;是一个简单的定时器&#xff0c;对于CM3,CM4内核芯片&#xff0c;都有Systick定时器。Systick定时器常用来做延时&#xff0c;或者实时系统的心跳时钟。这样可以节省MCU资源&#xff0c;不用浪费一个定时器。比如UCOS中&#xff0c;分…

每日一题:矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]使用两个标记变量。 class Sol…

【docker】容器技术发展历史

容器技术发展历史 Jail 时代1979 年 贝尔实验室发明 chroot2000 年 FreeBSD 4.0 发行 FreeBSD Jail2001 年 Linux VServer 发行2004 年 Solaris Containers 发行 云时代2006 年 google 推出 Process Containers2008 年 LXC 推出2011 年 CloudFoundry 推出 Warden2013 年 LMCTFY…

1. C# 进程间同步机制(Mutex和EventWaitHandle)实现单一应用启动

文章目录 一. 技能目标二. 技能知识点介绍① Mutex(互斥量)② EventWaitHandle(事件等待句柄) 三. 在WPF应用程序中启动程序的时候检查应用是否已经启动,如果已经启动就将主窗口显示出来 一. 技能目标 在开发应用程序的过程中,我们会遇到这样的情况,当我们启动一个应用的时候,如…

蓝桥杯——求和

题目 给定 n 个整数 a1, a2&#xff0c;…,an&#xff0c;求它们两两相乘再相加的和即: Sa1a2a1a3a1ana2a3 a&#xff08;n-2&#xff09;*an...a(n-1)*an 输入格式 输入的第一行包含一个整数 n。 第二行包含 几 个整数 a1,a2,,an。 输出格式 输出一个整数 S&#xff0c;表示所…

蓝桥杯 2022 省 B 洛谷 P8787 砍竹子

[蓝桥杯 2022 省 B] 砍竹子 题目描述 这天,小明在砍竹子,他面前有 n n n 棵竹子排成一排,一开始第 i i i 棵竹子的高度为 h i h_{i} hi​. 他觉得一棵一棵砍太慢了,决定使用魔法来砍竹子。魔法可以对连续的一段相同高度的竹子使用,假设这一段竹子的高度为 H H H,那…

全球IP数据库:多维度的数据收集与应用

随着互联网的普及和信息技术的飞速发展&#xff0c;全球IP数据库作为一种重要的数据资源&#xff0c;正在被广泛应用于各个领域。全球IP数据库不仅包含了庞大的IP地址信息&#xff0c;还涵盖了丰富的多维度数据&#xff0c;这些数据可以帮助企业、政府和研究机构更好地了解用户…