前言
界面在实现事件等待时,通过会显示一个转圈圈的动态图片,表示“正在加载”,事件完成之后关闭图片,QT中可以使用QMovie+QLabel完成gif动态图片的播放及关闭的效果。
效果图
功能讲解
1、加载动画
void MainWindow::addloadgif(const QString& gifpath,const QString& showmsg){QSize size = this->size(); //获取MainWindow的长宽高int rwidth = size.width();int rheight = size.height();int gif_width = 120;int gif_height = gif_width;// 创建一个标签来显示加载动画m_loadingLabel = new QLabel(this);//setGeometry(int x, int y, int width, int height) x:x坐标;y:y坐标;width:宽度;height:高度m_loadingLabel->setGeometry((rwidth-m_loadingLabel->width())/2, ((rheight - m_loadingLabel->height()) / 2)-60,gif_width,gif_height);m_msgLabel = new QLabel(showmsg,this);m_msgLabel->setAlignment(Qt::AlignCenter); // 设置文本居中// 设置字体大小QFont font = m_msgLabel->font();font.setPointSize(12); // 设置为12号字体,根据需要可以调整大小m_msgLabel->setFont(font);m_msgLabel->setGeometry((rwidth-m_msgLabel->width())/2,((rheight - m_msgLabel->height()) / 2)+60,gif_width,40);// 创建一个QMovie对象来加载GIF动画m_movie = new QMovie(gifpath); // 替换为你的GIF路径m_loadingLabel->setScaledContents(true);m_loadingLabel->setFixedSize(gif_width,gif_height);m_loadingLabel->setMovie(m_movie);m_movie->start();stopLoading();
}
图片和文字各自占用一个label,为了让label在MainWindow中间显示,通过QSize size = this->size(); 获取MainWindow的宽和高,并通过setGeometry设置具体的位置
//把两个label的位置调整到正中间
m_loadingLabel->setGeometry((rwidth-m_loadingLabel->width())/2, ((rheight - m_loadingLabel->height()) / 2)-60,gif_width,gif_height);
m_msgLabel->setGeometry((rwidth-m_msgLabel->width())/2,((rheight - m_msgLabel->height()) / 2)+60,gif_width,40);
通过QMovie加载动画,m_movie->start();是开始播放动画
// 创建一个QMovie对象来加载GIF动画m_movie = new QMovie(gifpath); // 替换为你的GIF路径m_loadingLabel->setScaledContents(true);m_loadingLabel->setFixedSize(gif_width,gif_height);m_loadingLabel->setMovie(m_movie);m_movie->start();
2、按钮功能打开、关闭动画
在初始化函数中,创建按钮,以及调用addloadgif加载动画,按钮会触发simulateLoading槽函数
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{//ui->setupUi(this);// 设置主窗口setFixedSize(600, 400);// 创建一个布局来管理标签位置m_layout = new QVBoxLayout;// 添加一个按钮,用于模拟其他操作m_LoadingButton = new QPushButton("关闭动画", this);m_layout->addWidget(m_LoadingButton);connect(m_LoadingButton, &QPushButton::clicked, this, &MainWindow::simulateLoading);addloadgif(":/index/img/load.gif","正在处理...");
}
void MainWindow::stopLoading() {// 停止动画//m_movie->stop();//把标签隐藏起来m_loadingLabel->hide();m_msgLabel->hide();m_LoadingButton->setText("开启动画");m_openstatus = false;
}
void MainWindow::showLoading() {////m_movie->start();m_loadingLabel->show();m_msgLabel->show();m_LoadingButton->setText("关闭动画");m_openstatus = true;
}
void MainWindow::simulateLoading() {if(m_openstatus){stopLoading();}else{showLoading();}
}