【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类是一个方便的类,用于播放具有QImageReader的动画。此类用于显示没有声音的简单动画。如果您想显示视频和媒体内容,请改用Qt多媒体框架Qt Multimedia mul…...

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

【Rabbit MQ】Rabbit MQ 消息的可靠性 —— 生产者和消费者消息的确认,消息的持久化以及消费失败的重试机制
文章目录 前言:消息的可靠性问题一、生产者消息的确认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(Community Enterprise Op…...

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

JS动态转盘可手动设置份数与概率(详细介绍)
这个案例是我老师布置的一项作业,老师已详细讲解,本人分享给大家,详细为你们介绍如何实现。 我们转盘使用线段来实现 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title>&l…...
在k8s中,etcd有什么作用?
在Kubernetes(K8s)中,etcd 是一个关键的组件,它扮演着集群状态存储的角色,具有以下作用: 分布式键值存储:etcd 是一个分布式键值存储系统,用于存储整个 Kubernetes 集群的配置信息、…...
conda配置虚拟环境相关记录
#教程 创建虚拟环境 创建 conda create --name yourEnv python3.7.5--name:也可以缩写为-n,【yourEnv】是新创建的虚拟环境的名字,创建完,可以装anaconda的目录下找到envs/yourEnv 目录python3.7.5:是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,上传图片并可设置大小
上传图片 基础使用(标题、粗体、斜体、超链接、缩进段落、有序无序、上传图片) 官网查看:https://ckeditor.com/docs/ckeditor5/latest/installation/integrations/react.html 安装依赖 npm install --save ckeditor/ckeditor5-react cked…...
【工具使用】批量修改文件夹的时间操作
一,简介 在工作过程中,有时需要修改文件夹的时间,本文分别介绍如何使用PowerShell修改文件夹的时间为指定时间或者当前时间。 二,操作步骤 请注意,在运行任何更改文件和文件夹时间的命令之前,请确保你有…...

Android Snackbar
1.Snackbar Snackbar是Material Design中的一个控件,用来代替Toast。Snackbar是一个类似Toast的快速弹出消息提示的控件。Snackbar在显示上比Toast丰富,而且提供了用户交互的接口。 ①默认情况下,Snackbar显示在屏幕底部,它出现…...
详解API接口如何安全的传输数据(内附商品详情API接口接入方式)
概述 API接口的安全传输是确保数据在API请求和响应之间的传输过程中不被截获、篡改或泄露的重要步骤。以下是一些用于增强API接口安全传输的常见技术和最佳实践: 使用HTTPS:使用HTTPS协议而不是HTTP,以确保数据在传输过程中的安全性。HTTPS使…...

网工内推 | 大专以上,福利待遇好,IE认证优先(云厂商)
01 主动脉科技有限公司 招聘岗位:网络工程师 职责描述: 1.负责云计算,IDC,BGP网络,通过团队协作,构建云业务后台技术支持服务体系。 2.通过工单、其他通讯工具等线上方式完成对客户的实施售后支持&#x…...

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

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

损失函数(Loss Function)一文详解-聚类问题常见损失函数Python代码实现+计算原理解析
损失函数(Loss Function)一文详解-聚类问题常见损失函数Python代码实现计算原理解析 前言 损失函数无疑是机器学习和深度学习效果验证的核心检验功能,用于评估模型预测值与实际值之间的差异。我们学习机器学习和深度学习或多或少都接触到了损失函数,但…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...