【Qt】文件与音视频

news2024/11/26 9:49:19

目录

一、输入输出设备类

二、文件读写类

三、文件和目录信息类

四、音视频

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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    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.coloradmin.cn/o/1580137.html

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

相关文章

JavaScript保姆级详细教程

目录 JavaScript的学习思路可以按照以下步骤进行&#xff1a; 函数定义&#xff1a; avaScript 中常见的一些方法和函数的分类及示例 1. 内置函数 (Built-in Functions) 2. 自定义函数 (Custom Functions) 3. 方法 (Methods) 4. 回调函数 (Callbacks) 5. 箭头函数 (Arrow…

openhomeny鸿蒙调用so示例(亲测有效)

分2个步骤说明: 1、创建C++和编译so 2、在新项目如何引用so并调用对应的api ===================》 1.1、创建C++工程 打开devecostudio,找到菜单File=》Create Project 1.2、选择Native C++,点击Next 1.3、选择默认,点击Finish,等待项目编译完成,结构如下: 1.4、 c…

Vue2 —— 学习(一)

目录 一、了解 Vue &#xff08;一&#xff09;介绍 &#xff08;二&#xff09;Vue 特点 &#xff08;三&#xff09;Vue 网站 1.学习&#xff1a; 2.生态系统&#xff1a; 3.团队 二、搭建 Vue 开发环境 &#xff08;一&#xff09;安装与引入 Vue 1.直接引入 2.N…

Burp练兵场之通过加密语言机绕过身份验证(思路鉴赏)

前言 之前有一段时间在玩Burp的靶场&#xff0c;感觉还不错&#xff0c;总体排名也冲到了top30 靶场地址 → https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-authentication-bypass-via-encryption-oracle 通过加密预言机绕过身份验证 靶场信息…

如何理解WMS仓储管理系统的建设理念

在现代企业经营中&#xff0c;WMS仓储管理系统的建设已成为提升竞争力的关键所在。随着科技的不断发展&#xff0c;越来越多的企业开始寻求实现高度自动化、信息化和网络化的生产模式。WMS仓储管理系统则成为实现这一目标的重要工具。本文将深入探讨WMS仓储管理系统解决方案的建…

关于Emulator和Simulator的探讨

由于写论文需要&#xff0c;仔细的学习和比对一下Emulator和Simulator的概念。原来“Emulator专门指硬件模拟&#xff0c;Simulator专门指软件模拟”的观点是不正确的&#xff0c;于是查看了很多文章的解释。同时也提醒自己&#xff0c;做科研一定要认真细致&#xff0c;无论看…

引领教育变革:山海鲸可视化智慧教育方案

随着信息技术的迅猛发展&#xff0c;教育领域正迎来一场深刻的变革。山海鲸可视化智慧教育解决方案&#xff0c;以其创新的技术和丰富的应用场景&#xff0c;正成为推动教育现代化进程的重要力量。 山海鲸可视化智慧教育解决方案是一套集教学、管理、服务于一体的综合性教育系…

C#:用定时器监控定时器,实现中止定时器正在执行的任务,并重启

Windows服务中使用的比较多的是定时器&#xff0c;但这种定时任务有个比较大的毛病&#xff1a;有时会莫名其妙地停止执行&#xff08;长时间执行不完&#xff0c;假死&#xff09;&#xff0c;必须得手工重启Windows服务才能恢复正常。这个就太麻烦了。 有没有办法来实现定时…

DataX,MongoDB数据导入hdfs与mysql

【尚硅谷】Alibaba开源数据同步工具DataX技术教程【尚硅谷】Alibaba开源数据同步工具DataX技术教程_哔哩哔哩_bilibili 目录 1、MongoDB 1.1、MongoDB介绍 1.2、MongoDB基本概念解析 1.3、MongoDB中的数据存储结构 1.4、MongoDB启动服务 1.5、MongoDB小案例 2、DataX导入…

vmware 一打开虚拟机就蓝屏重启

按照正常步骤安装完镜像后&#xff0c;点击 开启此虚拟机 &#xff0c;直接出现下图所示蓝屏&#xff0c;然后重启。 解决的办法是通过修改 启用或关闭windows功能 里的选项&#xff0c;如下图&#xff0c;勾选上 Windows虚拟机监控程序平台 和 虚拟机平台 两项。然后重启电脑…

C语言之自定义类型联合和枚举

目录 前言 一&#xff1a;联合体&#xff08;共用体&#xff09;union 1.联合体类型的声明 2.联合体的特点 3.联合体大小的计算 4.联合体判断机器的大小端 二&#xff1a;枚举enum 1.概念 2.枚举的优点 3.枚举的使用 接下来的日子会顺顺利利&#xff0c;万事胜意…

[paper note]LoRA+: 原理分析

论文信息 论文标题&#xff1a;LoRA: Efficient Low Rank Adaptation of Large Models 发表时间&#xff1a;2024年2月 论文内容 摘要 在本文中&#xff0c;我们表明&#xff0c;最初在论文《LoRA: Low-Rank Adaptation of Large Language Models》中引入的低秩适应&#…

人工智能应用工程师特训营丨国家认证,行业必备

人工智能应用工程特训营 提升目标&#xff1a; 1、提高专业认可度&#xff0c;增强职场竞争力 2、实战项目驱动&#xff0c;提升应用能力 3、技术体系全面&#xff0c;涵盖多个领域 4、实时在线答疑&#xff0c;强化学习互动 特训营学习流程&#xff1a; 职业技术证书&#xff…

WinRAR功能之【锁定压缩文件】

今天来分享一下WinRAR解压缩软件的“锁定压缩文件”功能&#xff0c;这个功能可以保护压缩包里文件的完整性&#xff0c;也就是不能随意增加、删除以及修改压缩包里的文件。我们可以用两种方式来设置&#xff0c;一起来看看吧&#xff01; 方式1&#xff1a;在压缩文件的时候&a…

Matlab进阶绘图第49期—气泡堆叠图

气泡堆叠图是堆叠图与气泡图的组合—在堆叠图每根柱子上方添加大小不同的气泡&#xff0c;用于表示另外一个数据变量&#xff08;如每根柱子各组分的平均值&#xff09;的大小。 本文利用自己制作的BarBubble工具&#xff0c;进行气泡堆叠图的绘制&#xff0c;先来看一下成品效…

牛客 2024春招冲刺题单 ONT82 腐烂的苹果【中等 BFS Java,Go】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/54ab9865ce7a45968b126d6968a77f34 思路 广度优先搜索。首先找到2坐标集合&#xff0c;然后每次往四周为1的坐标扩展参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数…

Unity 世界坐标、屏幕坐标、UGUI 坐标 相互转换

Unity 世界坐标、屏幕坐标、UGUI 坐标 相互转换坐标转换是游戏开发过程中必不可少的环节 看下图 世界坐标、屏幕坐标、UI 坐标 三种坐标系的转换过程&#xff0c;此文章中的 UI 坐标特指 UGUI 坐标 从上图可以看到&#xff0c;世界坐标 和 UI 坐标 需要通过 屏幕坐标作为中间转…

从“危”到“机”:HubSpot如何助企业转化出海营销CRM风险?

在全球化的大背景下&#xff0c;越来越多的企业选择出海拓展业务&#xff0c;以寻求更大的发展空间。然而&#xff0c;随着市场的扩大&#xff0c;企业在出海营销过程中也面临着各种风险。为了有效规避这些风险&#xff0c;许多企业选择借助HubSpot这样的专业营销软件。今天运营…

A Study of Network Forensic Investgation in Docker Environments文章翻译

A Study of Network Forensic Investgation in Docker Environments Docker环境下的网络取证研究 摘要 网络罪犯利用越来越多的技术(如虚拟机或基于容器的基础设施)进行恶意活动。 这些虚拟环境的固有动态简化了恶意服务的快速创建,并隐藏了所涉及的系统,这是以前没有的技…

C语言面试题之化栈为队

化栈为队 实例要求 C语言实现实现一个MyQueue类&#xff0c;该类用两个栈来实现一个队列&#xff1b;示例&#xff1a; MyQueue queue new MyQueue();queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false说明&…