有时候我们需要一个等待提示UI控件可以在任何需要告知用户操作正在进行中的情况下使用,以提高用户体验并避免用户的困惑和不必要的操作。通常情况下有如下的几种实现方式:1、自定义绘图,然后重写paintEvent函数,在paintEvent中绘制等待图标,通过QTimer更新绘制达到转圈圈的效果。2、 获取一张gif的资源图,然后使用QMovie 在一个QLabel 控件上加载显示gif的waiting等待动态。
本实例实现方式为获取一张gif的资源图,然后使用QMovie 在一个QLabel 控件上加载显示gif的waiting等待动态。你可以根据需要进行修改和扩展,实现你想要的程序启动等待提示栏效果。
想看纯代码实现的请移步:https://blog.csdn.net/u012959478/article/details/140436898
一、简述
QT利用QMovie动态加载实现自定义等待提示Ui控件。QMovie类用于播放具有QImageReader的动画。此类用于显示没有声音的简单动画。
二、 设计思路
QMovie类动态加载:
- 创建一个QMovie对象,通过setFileName()或setDevice()方法设置动画文件的路径或设备。
- 调用start()方法开始动画播放。
- 将QMovie对象设置为一个控件的背景,如QLabel,通过setMovie()方法设置。
- 调用show()方法显示控件和动画。
三、效果
四、核心代码
1、头文件
#ifndef LOADINGDIALOG_H
#define LOADINGDIALOG_H
#include <QDialog>
#include <QLabel>
#include <QMovie>
#include <QTimer>
class LoadingDialog : public QDialog
{
Q_OBJECT
public:
explicit LoadingDialog(QWidget* parent = nullptr);
~LoadingDialog();
void move_to_center(QWidget* pParent);
private:
void init();
private slots:
void onTimerTimeout();
private:
QLabel *m_lable;
QMovie *m_movie;
QFrame *m_centerFrame;
QTimer *m_pTimer;
QWidget *m_pParent;
};
#endif // LOADINGDIALOG_H
2、实现代码
#include "loadingdialog.h"
#include <QGridLayout>
LoadingDialog::LoadingDialog(QWidget *parent) : QDialog(parent)
{
m_pParent = parent;
//如果需要显示任务栏对话框则删除Qt::Tool
setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint);
setAttribute(Qt::WA_TranslucentBackground, true);
init();
}
LoadingDialog::~LoadingDialog()
{
delete m_lable;
delete m_movie;
delete m_centerFrame;
deleteLater();
}
void LoadingDialog::init()
{
this->setFixedSize(100, 100);
m_centerFrame = new QFrame(this);
m_centerFrame->setGeometry(10, 10 ,this->width()-10, this->height()-10);
//加载Loading动画
m_lable = new QLabel();
m_movie = new QMovie(":/res/loading.gif");
int size = qMin(m_lable->width(),m_lable->height());
m_movie->setScaledSize(QSize(size, size));
m_lable->setScaledContents(true);
m_lable->setMovie(m_movie);
m_movie->start();
QGridLayout *gridLayout = new QGridLayout();
gridLayout->setSpacing(0);
gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
gridLayout->setContentsMargins(2, 2, 2, 2);
gridLayout->addWidget(m_lable);
m_centerFrame->setLayout(gridLayout);
m_pTimer = new QTimer(this);
connect(m_pTimer, &QTimer::timeout, this, &LoadingDialog::onTimerTimeout, Qt::UniqueConnection);
m_pTimer->start(10);
}
void LoadingDialog::move_to_center(QWidget *pParent)
{
m_pParent = pParent;
if(pParent != nullptr && pParent != NULL)
{
int nParentWidth = pParent->width();
int nParentHeigth = pParent->height();
int nWidth = this->width();
int nHeight = this->height();
int nParentX = pParent->x();
int nParentY = pParent->y();
int x = (nParentX + (nParentWidth - nWidth) / 2);
int y = (nParentY + (nParentHeigth - nHeight) / 2);
this->move(x, y);
}
}
void LoadingDialog::onTimerTimeout()
{
move_to_center(m_pParent);
}
以上是等待提示UI控件的实现代码,在实际使用中,可以根据需要自定义动画文件和样式,以及更新逻辑。
需要注意的是,等待提示UI控件应该在适当的时机显示,并且要避免过长时间的等待,以免影响用户体验。同时,等待提示UI控件的样式应该简洁明了,清晰展示当前操作的状态,以便用户能够理解和接受。
五、使用示例
以下是一个简单的示例代码,演示了如何在Qt中使用此控件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "loadingdialog.h"
#include <thread>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
auto loading = new LoadingDialog(this);
loading->show();
}
总结一下,以上就是QT利用QMovie实现动态加载、等待提示框的一种设计方法和流程,在此操作的基础上我们可以发挥想象开发出更多更有意思的控件,源码我放在此处以下地址。如有错误也请各位看官手下留情,欢迎评论区批评指正。
谢谢你的关注和阅读,希望我的回答能帮到你。如果还有其他问题,欢迎随时向我提问。祝你一切顺利!