QT利用QMovie动态加载实现自定义等待提示Ui控件

          有时候我们需要一个等待提示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类动态加载:

  1. 创建一个QMovie对象,通过setFileName()或setDevice()方法设置动画文件的路径或设备。
  2. 调用start()方法开始动画播放。
  3. 将QMovie对象设置为一个控件的背景,如QLabel,通过setMovie()方法设置。
  4. 调用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实现动态加载、等待提示框的一种设计方法和流程,在此操作的基础上我们可以发挥想象开发出更多更有意思的控件,源码我放在此处以下地址。如有错误也请各位看官手下留情,欢迎评论区批评指正。

        谢谢你的关注和阅读,希望我的回答能帮到你。如果还有其他问题,欢迎随时向我提问。祝你一切顺利!

六、源代码下载

  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用 Qt 动画类和状态机实现等待动画示例: 首先,创建一个新的 Qt Widgets 应用程序项目,然后在主窗口的 UI 界面中添加一个 QLabel 控件,用于显示等待动画。 在头文件中,包含如下的 Qt 类: ```cpp #include <QWidget> #include <QStateMachine> #include <QState> #include <QPropertyAnimation> ``` 接着,在主窗口的构造函数中初始化状态机和动画,并将它们连接起来。示例代码如下: ```cpp MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 初始化状态机 QStateMachine *stateMachine = new QStateMachine(this); // 创建两个状态 QState *state1 = new QState(); QState *state2 = new QState(); // 添加状态到状态机 stateMachine->addState(state1); stateMachine->addState(state2); // 设置初始状态 stateMachine->setInitialState(state1); // 创建动画对象 QPropertyAnimation *animation = new QPropertyAnimation(ui->label, "text"); animation->setDuration(2000); // 动画持续时间 2 秒钟 animation->setStartValue(""); animation->setEndValue("Loading..."); // 将动画对象添加到状态机的状态转换中 state1->addTransition(ui->startButton, &QPushButton::clicked, state2); state2->addTransition(ui->stopButton, &QPushButton::clicked, state1); state1->addAnimation(animation); state2->addAnimation(animation); // 启动状态机 stateMachine->start(); } ``` 在上面的代码中,我们创建了一个 QStateMachine 类型的状态机对象,并创建了两个状态 state1 和 state2。我们将 QLabel 控件的文本属性与 QPropertyAnimation 类型的动画对象的属性 text 相关联,并设置了动画的持续时间为 2 秒钟。然后,我们将动画对象添加到状态机的状态转换中,并启动状态机。 最后,在主窗口的析构函数中,删除状态机和动画对象,示例代码如下: ```cpp MainWindow::~MainWindow() { delete ui; delete stateMachine; delete animation; } ``` 运行程序,点击 Start 按钮,即可看到等待动画效果。点击 Stop 按钮,动画会停止。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值