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

【Qt控件之QMovie】详解

Qt控件之QMovies

      • 概述
      • 公共类型
      • 属性
      • 公共函数
      • 公共槽函数
      • 信号
      • 静态公共成员
      • 示例
      • 使用场景

概述

QMovie类是一个方便的类,用于播放具有QImageReader的动画。此类用于显示没有声音的简单动画。如果您想显示视频和媒体内容,请改用Qt多媒体框架Qt Multimedia multimedia framework
首先,通过将文件的名称或包含动画图像格式的QIODevice的指针传递给QMovie的构造函数,创建一个QMovie对象。您可以在开始播放动画之前调用isValid()函数来检查图像数据是否有效。要开始播放动画,请调用start()函数。QMovie将进入Running状态,并发出started()stateChanged()信号。要获取动画的当前状态,请调用state()函数。
要在应用程序中显示动画,您可以将QMovie对象传递给QLabel::setMovie()函数。示例如下:

 QLabel label;QMovie *movie = new QMovie("animations/fire.gif");label.setMovie(movie);movie->start();

每当动画中有新帧可用时,QMovie将发出updated()信号。如果帧的大小发生更改,则发出resized()信号。您可以调用currentImage()currentPixmap()函数来获取当前帧的副本。当动画完成时,QMovie发出finished()信号。如果在播放过程中发生任何错误(即,图像文件损坏),QMovie将发出error()信号。
调用setSpeed()函数可以控制动画的播放速度,该函数将原始速度的百分比作为参数。通过调用setPaused(true)函数可以暂停动画。然后,QMovie将进入Paused状态,并发出stateChanged()信号。如果调用setPaused(false)函数,则QMovie将重新进入Running状态并重新开始动画。要停止动画,请调用stop()函数。
某些动画格式允许您设置背景颜色。您可以调用setBackgroundColor()函数来设置颜色,或者调用backgroundColor()函数来获取当前的背景颜色。
currentFrameNumber()函数返回当前帧的序列号。动画中的第一帧序列号为0。如果图像格式支持,frameCount()函数返回动画中的总帧数。可以调用loopCount()函数获取动画在完成之前应循环播放的次数。nextFrameDelay()函数返回当前帧应该显示的毫秒数。
可以通过调用setCacheMode()函数,指示QMovie缓存动画的帧。
调用supportedFormats()函数可以获取QMovie支持的格式列表。

公共类型

  • enum CacheMode { CacheNone, CacheAll } // 缓存模式
  • enum MovieState { NotRunning, Paused, Running } // 动画状态

属性

  • cacheMode : CacheMode // 缓存模式
  • speed : int // 速度

公共函数

  • QMovie(QObject *parent = Q_NULLPTR) // 构造函数
  • QMovie(QIODevice *device, const QByteArray &format = QByteArray(), QObject *parent = Q_NULLPTR)
  • QMovie(const QString &fileName, const QByteArray &format = QByteArray(), QObject *parent = Q_NULLPTR)
  • ~QMovie() // 析构函数
  • QColor backgroundColor() const // 获取背景颜色
  • CacheMode cacheMode() const // 获取缓存模式
  • int currentFrameNumber() const // 获取当前帧的序号
  • QImage currentImage() const // 获取当前帧的QImage对象
  • QPixmap currentPixmap() const // 获取当前帧的QPixmap对象
  • QIODevice *device() const // 获取当前设备
  • QString fileName() const // 获取文件名
  • QByteArray format() const // 获取格式
  • int frameCount() const // 获取动画的总帧数
  • QRect frameRect() const // 获取动画帧的矩形区域
  • bool isValid() const // 检查动画数据是否有效
  • bool jumpToFrame(int frameNumber) // 跳转到指定帧
  • int loopCount() const // 获取动画应循环播放的次数
  • int nextFrameDelay() const // 获取下一帧的延迟时间
  • QSize scaledSize() // 获取缩放尺寸
  • void setBackgroundColor(const QColor &color) // 设置背景颜色
  • void setCacheMode(CacheMode mode) // 设置缓存模式
  • void setDevice(QIODevice *device) // 设置设备
  • void setFileName(const QString &fileName) // 设置文件名
  • void setFormat(const QByteArray &format) // 设置格式
  • void setScaledSize(const QSize &size) // 设置缩放尺寸
  • int speed() const // 获取速度
  • MovieState state() const // 获取动画状态

公共槽函数

  • bool jumpToNextFrame() // 跳转到下一帧
  • void setPaused(bool paused) // 设置暂停状态
  • void setSpeed(int percentSpeed) // 设置速度
  • void start() // 开始播放动画
  • void stop() // 停止动画

信号

  • void error(QImageReader::ImageReaderError error) // 错误信号
  • void finished() // 动画完成信号
  • void frameChanged(int frameNumber) // 帧变化信号
  • void resized(const QSize &size) // 重新调整大小信号
  • void started() // 动画开始信号
  • void stateChanged(QMovie::MovieState state) // 状态变化信号
  • void updated(const QRect &rect) // 更新信号

静态公共成员

  • QList supportedFormats() // 支持的格式列表

示例

先上UI:
在这里插入图片描述
实现步骤在代码中有注释。
MoviePlayer.h

#ifndef MOVIEPLAYER_H
#define MOVIEPLAYER_H#include <QWidget>QT_BEGIN_NAMESPACE
class QCheckBox;
class QGridLayout;
class QHBoxLayout;
class QLabel;
class QMovie;
class QSlider;
class QSpinBox;
class QToolButton;
class QVBoxLayout;
QT_END_NAMESPACEclass MoviePlayer : public QWidget
{Q_OBJECTpublic:MoviePlayer(QWidget *parent = 0);// 打开文件void openFile(const QString &fileName);private slots:// 打开槽函数void open();// 跳转到某帧void goToFrame(int frame);// 适应窗口void fitToWindow();// 更新按钮状态void updateButtons();// 更新帧滑动条void updateFrameSlider();// 当微调框数据改变时,触发此槽void slot_valueChanged(int nPercentSpeed);private:// 创建控件void createControls();// 创建按钮:开始、暂停、停止void createButtons();// 目录QString currentMovieDirectory;QLabel *movieLabel;	// 防止QMoive的控件QMovie *movie;	// QMoive对象QToolButton *openButton;QToolButton *playButton;QToolButton *pauseButton;QToolButton *stopButton;QToolButton *quitButton;QCheckBox *fitCheckBox;QSlider *frameSlider;QSpinBox *speedSpinBox;QLabel *frameLabel;QLabel *speedLabel;QGridLayout *controlsLayout;QHBoxLayout *buttonsLayout;QVBoxLayout *mainLayout;
};#endif

MoviePlayer.cpp

#include <QtWidgets>#include "movieplayer.h"MoviePlayer::MoviePlayer(QWidget *parent): QWidget(parent)
{movie = new QMovie(this);movie->setCacheMode(QMovie::CacheAll);movieLabel = new QLabel(tr("No movie loaded"));movieLabel->setAlignment(Qt::AlignCenter);movieLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);movieLabel->setBackgroundRole(QPalette::Dark);movieLabel->setAutoFillBackground(true);currentMovieDirectory = "movies";createControls();createButtons();connect(movie, SIGNAL(frameChanged(int)), this, SLOT(updateFrameSlider()));connect(movie, SIGNAL(stateChanged(QMovie::MovieState)),this, SLOT(updateButtons()));connect(fitCheckBox, SIGNAL(clicked()), this, SLOT(fitToWindow()));connect(frameSlider, SIGNAL(valueChanged(int)), this, SLOT(goToFrame(int)));connect(speedSpinBox, SIGNAL(valueChanged(int)),this, SLOT(slot_valueChanged(int)));//            movie, SLOT(setSpeed(int)));mainLayout = new QVBoxLayout;mainLayout->addWidget(movieLabel);mainLayout->addLayout(controlsLayout);mainLayout->addLayout(buttonsLayout);setLayout(mainLayout);updateFrameSlider();updateButtons();setWindowTitle(tr("Movie Player"));resize(400, 400);
}void MoviePlayer::open()
{QString fileName = QFileDialog::getOpenFileName(this, tr("Open a Movie"),currentMovieDirectory);if (!fileName.isEmpty())openFile(fileName);
}void MoviePlayer::openFile(const QString &fileName)
{currentMovieDirectory = QFileInfo(fileName).path();movie->stop();movieLabel->setMovie(movie);movie->setFileName(fileName);movie->start();updateFrameSlider();updateButtons();
}void MoviePlayer::goToFrame(int frame)
{movie->jumpToFrame(frame);
}void MoviePlayer::fitToWindow()
{movieLabel->setScaledContents(fitCheckBox->isChecked());
}void MoviePlayer::updateFrameSlider()
{bool hasFrames = (movie->currentFrameNumber() >= 0);if (hasFrames) {if (movie->frameCount() > 0) {frameSlider->setMaximum(movie->frameCount() - 1);} else {if (movie->currentFrameNumber() > frameSlider->maximum())frameSlider->setMaximum(movie->currentFrameNumber());}frameSlider->setValue(movie->currentFrameNumber());} else {frameSlider->setMaximum(0);}frameLabel->setEnabled(hasFrames);frameSlider->setEnabled(hasFrames);
}void MoviePlayer::slot_valueChanged(int nPercentSpeed)
{qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "nPercentSpeed :" << nPercentSpeed;movie->setSpeed(nPercentSpeed);
}void MoviePlayer::updateButtons()
{playButton->setEnabled(movie->isValid() && movie->frameCount() != 1&& movie->state() == QMovie::NotRunning);pauseButton->setEnabled(movie->state() != QMovie::NotRunning);pauseButton->setChecked(movie->state() == QMovie::Paused);stopButton->setEnabled(movie->state() != QMovie::NotRunning);
}void MoviePlayer::createControls()
{fitCheckBox = new QCheckBox(tr("Fit to Window"));frameLabel = new QLabel(tr("Current frame:"));frameSlider = new QSlider(Qt::Horizontal);frameSlider->setTickPosition(QSlider::TicksBelow);frameSlider->setTickInterval(10);speedLabel = new QLabel(tr("Speed:"));speedSpinBox = new QSpinBox;speedSpinBox->setRange(1, 9999);speedSpinBox->setValue(100);speedSpinBox->setSuffix(tr("%"));controlsLayout = new QGridLayout;controlsLayout->addWidget(fitCheckBox, 0, 0, 1, 2);controlsLayout->addWidget(frameLabel, 1, 0);controlsLayout->addWidget(frameSlider, 1, 1, 1, 2);controlsLayout->addWidget(speedLabel, 2, 0);controlsLayout->addWidget(speedSpinBox, 2, 1);
}void MoviePlayer::createButtons()
{QSize iconSize(36, 36);openButton = new QToolButton;openButton->setIcon(style()->standardIcon(QStyle::SP_DialogOpenButton));openButton->setIconSize(iconSize);openButton->setToolTip(tr("Open File"));connect(openButton, SIGNAL(clicked()), this, SLOT(open()));playButton = new QToolButton;playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));playButton->setIconSize(iconSize);playButton->setToolTip(tr("Play"));connect(playButton, SIGNAL(clicked()), movie, SLOT(start()));pauseButton = new QToolButton;pauseButton->setCheckable(true);pauseButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause));pauseButton->setIconSize(iconSize);pauseButton->setToolTip(tr("Pause"));connect(pauseButton, SIGNAL(clicked(bool)), movie, SLOT(setPaused(bool)));stopButton = new QToolButton;stopButton->setIcon(style()->standardIcon(QStyle::SP_MediaStop));stopButton->setIconSize(iconSize);stopButton->setToolTip(tr("Stop"));connect(stopButton, SIGNAL(clicked()), movie, SLOT(stop()));quitButton = new QToolButton;quitButton->setIcon(style()->standardIcon(QStyle::SP_DialogCloseButton));quitButton->setIconSize(iconSize);quitButton->setToolTip(tr("Quit"));connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));buttonsLayout = new QHBoxLayout;buttonsLayout->addStretch();buttonsLayout->addWidget(openButton);buttonsLayout->addWidget(playButton);buttonsLayout->addWidget(pauseButton);buttonsLayout->addWidget(stopButton);buttonsLayout->addWidget(quitButton);buttonsLayout->addStretch();
}

调用

#include <QApplication>#include "movieplayer.h"int main(int argc, char *argv[])
{QApplication app(argc, argv);MoviePlayer player;player.show();player.show();return app.exec();
}

使用场景

  • 在刷新页面时,可以使用QMovie来实现等待界面。
  • QMovie类也适用于在应用程序中显示电影。通过将QMovie对象传递给QLabel::setMovie(),可以将动画显示在QLabel控件中。

总之,QMovie类适用于需要播放简单动画或实现等待界面的各种场景。

相关文章:

【Qt控件之QMovie】详解

Qt控件之QMovies 概述公共类型属性公共函数公共槽函数信号静态公共成员示例使用场景 概述 QMovie类是一个方便的类&#xff0c;用于播放具有QImageReader的动画。此类用于显示没有声音的简单动画。如果您想显示视频和媒体内容&#xff0c;请改用Qt多媒体框架Qt Multimedia mul…...

Star History 九月开源精选 |开源 GitHub Copilot 替代

虽然大火了近一年&#xff0c;但是截至目前 AI 唯一破圈的场景是帮助写代码&#xff08;谷歌云旗下的 DORA 年度报告也给 AI 泼了盆冷水&#xff09;。不过对于软件开发来说&#xff0c;生成式人工智能绝对已经是新的标配。 本期 Star History 收集了一些开源 GitHub Copilot …...

【Rabbit MQ】Rabbit MQ 消息的可靠性 —— 生产者和消费者消息的确认,消息的持久化以及消费失败的重试机制

文章目录 前言&#xff1a;消息的可靠性问题一、生产者消息的确认1.1 生产者确认机制1.2 实现生产者消息的确认1.3 验证生产者消息的确认 二、消息的持久化2.1 演示消息的丢失2.2 声明持久化的交换机和队列2.3 发送持久化的消息 三、消费者消息的确认3.1 配置消费者消息确认3.2…...

C++设计模式_25_Interpreter 解析器

Interpreter 解析器被归为“领域规则”模式。Interpreter模式比较适合简单的文法表示,应用场景是比较有限的,解决问题的思路和场景都是一样的。 文章目录 1. “领域规则”模式1.1 典型模式2. 动机( Motivation)3. 代码演示Interpreter 解析器模式4. 模式定义5. 结构( Structu…...

能源化工过程-故障诊断数据集初探-田纳西-伊斯曼过程数据集

1. 田纳西-伊斯曼过程(TE)数据集简介 整个TE数据集由训练集和测试集构成,TE集中的数据由22次不同的仿真运行数据构成,TE集中每个样本都有52个观测变量。d00.dat至d21.dat为训练集样本,d00_te.dat至d21_te.dat为测试集样本。d00.dat和d00_te.dat为正常工况下的样本。d00.d…...

【Linux】安装配置解决CentosMobaXterm的使用及Linux常用命令以及命令模式

目录 Centos的介绍 centos安装配置&MobaXterm 创建 安装 ​编辑 配置 ​编辑 MobaXterm使用 Linux常用命令&模式 常用命令 vi或vim编辑器 三种模式 命令模式 编辑模式 末行模式 拍照备份 Centos的介绍 CentOS&#xff08;Community Enterprise Op…...

一台服务器安装两个mysql、重置数据库用于测试使用

文章目录 一、切数据库数据存储文件夹已经存在数据库数据文件夹新建数据库数据文件夹 二、安装第二个mysql安装新数据库初始化数据库数据启动数据库关闭数据库 三、mysqld_multi单机多实例部署参考文档 一、切数据库数据存储文件夹 这个方法可以让你不用安装新的数据库&#x…...

JS动态转盘可手动设置份数与概率(详细介绍)

这个案例是我老师布置的一项作业&#xff0c;老师已详细讲解&#xff0c;本人分享给大家&#xff0c;详细为你们介绍如何实现。 我们转盘使用线段来实现 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title>&l…...

在k8s中,etcd有什么作用?

在Kubernetes&#xff08;K8s&#xff09;中&#xff0c;etcd 是一个关键的组件&#xff0c;它扮演着集群状态存储的角色&#xff0c;具有以下作用&#xff1a; 分布式键值存储&#xff1a;etcd 是一个分布式键值存储系统&#xff0c;用于存储整个 Kubernetes 集群的配置信息、…...

conda配置虚拟环境相关记录

#教程 创建虚拟环境 创建 conda create --name yourEnv python3.7.5--name&#xff1a;也可以缩写为-n&#xff0c;【yourEnv】是新创建的虚拟环境的名字&#xff0c;创建完&#xff0c;可以装anaconda的目录下找到envs/yourEnv 目录python3.7.5&#xff1a;是python的版本号…...

数据库的本质永远都不会改变基础语句(第二十二课)

JAVA与Mysql._java数据库和mysql_真正的醒悟的博客-CSDN博客...

Object转List<>,转List<Map<>>

这样就不会局限在转换到List<Map<String,Object>>这一种类型上了.可以转换成List<Map<String,V>>上等,进行泛型转换虽然多了一个参数,但是可以重载啊注: 感觉field.get(key) 这里处理的不是很好,如果有更好的办法可以留言 public static <K, V> …...

React使用富文本CKEditor 5,上传图片并可设置大小

上传图片 基础使用&#xff08;标题、粗体、斜体、超链接、缩进段落、有序无序、上传图片&#xff09; 官网查看&#xff1a;https://ckeditor.com/docs/ckeditor5/latest/installation/integrations/react.html 安装依赖 npm install --save ckeditor/ckeditor5-react cked…...

【工具使用】批量修改文件夹的时间操作

一&#xff0c;简介 在工作过程中&#xff0c;有时需要修改文件夹的时间&#xff0c;本文分别介绍如何使用PowerShell修改文件夹的时间为指定时间或者当前时间。 二&#xff0c;操作步骤 请注意&#xff0c;在运行任何更改文件和文件夹时间的命令之前&#xff0c;请确保你有…...

Android Snackbar

1.Snackbar Snackbar是Material Design中的一个控件&#xff0c;用来代替Toast。Snackbar是一个类似Toast的快速弹出消息提示的控件。Snackbar在显示上比Toast丰富&#xff0c;而且提供了用户交互的接口。 ①默认情况下&#xff0c;Snackbar显示在屏幕底部&#xff0c;它出现…...

详解API接口如何安全的传输数据(内附商品详情API接口接入方式)

概述 API接口的安全传输是确保数据在API请求和响应之间的传输过程中不被截获、篡改或泄露的重要步骤。以下是一些用于增强API接口安全传输的常见技术和最佳实践&#xff1a; 使用HTTPS&#xff1a;使用HTTPS协议而不是HTTP&#xff0c;以确保数据在传输过程中的安全性。HTTPS使…...

网工内推 | 大专以上,福利待遇好,IE认证优先(云厂商)

01 主动脉科技有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1.负责云计算&#xff0c;IDC&#xff0c;BGP网络&#xff0c;通过团队协作&#xff0c;构建云业务后台技术支持服务体系。 2.通过工单、其他通讯工具等线上方式完成对客户的实施售后支持&#x…...

Python time strptime()和strftime()

1 strptime()方法 根据指定的格式把一个时间字符串解析为时间元组 重要的时间日期格式化符号 %y 两位数的年份表示&#xff08;00-99&#xff09; %Y 四位数的年份表示&#xff08;000-9999&#xff09; %m 月份&#xff08;01-12&#xff09; %d 月内中的一天&#xff08;0-…...

是谁家班主任还不知道 怎么发布期中成绩啊。

你知道吗&#xff1f;居然还有班主任不知道怎么发布期中成绩&#xff01; 发布成绩并不是一件难事&#xff0c;只需几个步骤&#xff0c;就能轻松搞定&#xff01; 给大家讲一下成绩查询是什么。成绩查询是指学生通过一定的方式&#xff0c;如输入学号、姓名等&#xff0c;在指…...

损失函数(Loss Function)一文详解-聚类问题常见损失函数Python代码实现+计算原理解析

损失函数(Loss Function)一文详解-聚类问题常见损失函数Python代码实现计算原理解析 前言 损失函数无疑是机器学习和深度学习效果验证的核心检验功能&#xff0c;用于评估模型预测值与实际值之间的差异。我们学习机器学习和深度学习或多或少都接触到了损失函数&#xff0c;但…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...