当程序加载较慢的时候,为了告知用户正在加载,需要在界面上显示正在加载中的提示。下面简单说一下自己使用中出现的问题。

一、在主线程中使用动画加载

创建基于qapplication的项目,以qdialog类为基类,有.ui文件。
项目的结构如下图所示:

需要自己在网上找一些加载中的动图存入gifs文件夹中,建立项目后,向项目中添加资源文件,即添加新文件-》添加qt资源文件-》添加资源文件的文件夹名(这里填写的是qrc)-》向其中添加前缀,添加文件,再保存。
下面是创建的一个小的demo,直接上代码。
main.cpp

#include "dialog.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Dialog w;w.show();return a.exec();
}

上面的main.cpp采用的是自动生成的文件,未做任何改动。
dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QLabel>
#include <QMovie>QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACEclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();void loadingGif();
private:Ui::Dialog *ui;QLabel * m_label;QLabel * m_textLabel;QMovie * m_movie;
};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);loadingGif();
}Dialog::~Dialog()
{m_movie->stop();if(m_movie != nullptr){delete m_movie;m_movie = nullptr;}delete ui;
}void Dialog::loadingGif()
{m_label = new QLabel(this);m_textLabel = new QLabel("正在加载......",this);m_label->setGeometry(150,130,120,120);m_textLabel->setGeometry(150,250,120,40);m_movie = new QMovie(":/new/prefix1/gifs/771.gif");m_label->setScaledContents(true);//缩放label使其适应其内容m_label->setFixedSize(120,120);m_label->setMovie(m_movie);m_movie->start();
}

以上便是项目的源文件,运行程序后效果如下。

编译环境为:qtcreate5.13.2,编译器为MinGW32位。

二、通过子线程使用动画加载

也是创建基于qapplication的应用程序,基类位qdialog,包含ui文件。
文件的结构如下:

具体的代码如下:
mian.cpp

#include "dialog.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Dialog w;w.show();return a.exec();
}

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include "hintthread.h"
#include <QDialog>
#include <QLabel>
#include <QMovie>
#include <QVBoxLayout>QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACEclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();void diaplayHintMark();//显示正在更新的动画
public slots:void slot_displayHintMark();
private:Ui::Dialog *ui;QLabel *    m_label;QMovie *    m_movie;QLabel *    m_textLabel;QVBoxLayout * m_layout;hintThread  * m_thread;
};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
#include <QPalette>Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);//    this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowMinimizeButtonHint);QPalette palette(this->palette());palette.setColor(QPalette::Background, QColor(16,48,155,255));this->setPalette(palette);
//    this->setAttribute(Qt::WA_TranslucentBackground);//创建线程,子线程更新提示m_thread = new hintThread(this);m_thread->start();//    diaplayHintMark();
}Dialog::~Dialog()
{m_movie->stop();if(m_movie != nullptr){delete m_movie;m_movie = nullptr;}if(m_thread->isRunning()){m_thread->quit();m_thread->wait();if(m_thread != nullptr){delete m_thread;m_thread = nullptr;}}else{if(m_thread != nullptr){delete m_thread;m_thread = nullptr;}}delete ui;
}void Dialog::diaplayHintMark()
{qDebug()<<"开始加载";//ui->insideWidgetm_label = new QLabel(this/*,Qt::WindowStaysOnTopHint*/);m_movie = new QMovie(":/new/prefix1/gifs/771.gif");m_label->setGeometry(QRect(100,100,120,120));m_label->setFixedSize(120,120);m_label->setScaledContents(true);m_label->setMovie(m_movie);m_textLabel = new QLabel("努力加载中,请稍后.....",this);m_textLabel->setGeometry(100,220,300,40);m_label->show();//没有调用显示函数m_textLabel->show();m_movie->start();qDebug()<<"你好。。。。!";qDebug()<<"what should i do。。。。!";
}void Dialog::slot_displayHintMark()
{diaplayHintMark();
}

hintthread.h

#ifndef HINTTHREAD_H
#define HINTTHREAD_H#include <QThread>class Dialog;
class hintThread : public QThread
{Q_OBJECT
public:hintThread(Dialog * dlg);hintThread(QObject* parent = 0);
signals:void signalDisplayHintMark();
public slots:void slot_displayHintMark();
protected:void run();
private:Dialog * m_dlg;
};
#endif // HINTTHREAD_H

hintthread.cpp

#include "hintthread.h"
#include "dialog.h"hintThread::hintThread(Dialog * dlg)
:QThread()
{m_dlg = dlg;//以下两种信号槽绑定都可以
//    connect(this,SIGNAL(signalDisplayHintMark()),m_dlg,SLOT(slot_displayHintMark()));connect(this,SIGNAL(signalDisplayHintMark()),this,SLOT(slot_displayHintMark()));
}hintThread::hintThread(QObject* parent): QThread(parent)
{}void hintThread::slot_displayHintMark()
{m_dlg->diaplayHintMark();
}void hintThread::run()
{emit signalDisplayHintMark();
}

程序的运行效果和上面类似 。第二个例子中通过创建子线程时传入主线程的指针,在子线程中发出信号,通过主线程指针调取主线程ui中的函数。上面第二个例子中,diaplayHintMark()函数未调用两个label的show()显示时,无法正常的显示,此时,函数中label也已设置了父窗口,但没法显示。在第一个例子中,也只是设置了label的父窗口,没有调用show(),可以显示,没想明白是什么原因,望知情者告知。

qt使用动画提示正在载中相关推荐

  1. jQuery Mobile 手动显示ajax加载器,提示加载中...

    在使用jQuery Mobile开发时,有时候我们需要在请求ajax期间,显示加载提示框(例如:一个旋转图片+一个提示:加载中...).这个时候,我们可以手动显示jQuery Mobile的加载器,大 ...

  2. 好看的html登录遮罩提示加载中,jQuery炫酷页面预加载Loading特效插件

    fakeLoader.js是一款轻量级的 jQuery 炫酷页面预加载Loading特效插件.它能帮助我们创建一个全屏遮罩效果的旋转loading效果来模拟页面预加载过程. Bower安装 bower ...

  3. css3实现 依次出现三个点(一般用于提示加载中。。。 提交中。。。)

    <a href="javascript:" class="login">登录中<span class="dotting"& ...

  4. 微信小程序在加载中时如何显示提示框?

    链接: 微信小程序文档wx.showLoading 使用wx.showLoading()   显示 loading 提示框.需主动调用 wx.hideLoading 才能关闭提示框   在请求数据前使 ...

  5. 利用JS弹出层实现简单的动态提示“正在加载中,请稍等...”

    JQuery版本:1.7.1: 编写一个JS类(ck.layer.js): [javascript] view plaincopy /********************************* ...

  6. ajax 延迟显示加载中提示

    近期做项目时用到了jquery的ajax,我希望实现"加载时提示用户"的功能,于是先习惯性的度娘谷哥了下,发现按照网上朋友所说的做,每次加载都会提示,不符合我的需求.于是我改进了下 ...

  7. 10个CSS和jQuery的加载中(loading)动画效果实现

    以往web开发中都使用Gif来实现加载中的效果,但是随着技术的发展我们也可以使用jQuery和CSS来实现加载中的效果,希望大家喜欢! 相关文章: 5个在线Ajax"加载中"旋转图 ...

  8. html 载入中,用纯CSS实现加载中动画效果

    今天要介绍的是用简单的CSS--只用CSS,不用Gif--制作"加载中-"动画效果.先看看效果: 上面的这个加载中效果,以前是用gif动图实现的,但随着CSS的进步,CSS动画功能 ...

  9. dwz怎么使用数据加载中提示_百度地图数据采集手把手教,从此POI数据不再是愁...

    本文介绍使用八爪鱼采集百度地图数据(以上海-建设银行为例)的方法 采集网站:http://map.baidu.com/ 适用版本:八爪鱼7版本,8版本请参照官网新手入门教程制作 8版本新手入门教程:用 ...

最新文章

  1. 面向对象概念及三大特点
  2. Xamarin Anroid开发教程之下载安装Xamarin
  3. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexFile loadDexFile 函数 | 构造函数 | openDexFile 函数 )
  4. linux网络编程之并发服务器的三种实现模型 (超级经典)
  5. 值不值得入手_iPhone11现在还值不值得入手?真实用户说出心里话
  6. prop attr 到底哪里不一样?
  7. flexsim物流仿真案例_仓储物流设计-从设计方法到应用参数
  8. python编程一球从100米_Python练习题 015:一颗自由落地的球
  9. 熊猫的python小课账号_校长,我要上车——python模拟登录熊猫TV
  10. 第115章 SQL函数 REPEAT
  11. 一文带你全方位了解网卡
  12. 卸载趋势杀毒软件的步骤
  13. java——》解析简历
  14. 联通猫无线灯闪 不能连接服务器,猫如何连接路由器,光猫光信号一直闪红灯
  15. 为实施了IFD的Dynamics 365更换自签名的SSL证书以符合Chrome的要求
  16. iOS开发 - 给Label加下划线、中划线
  17. 你觉得什么叫做幸福?
  18. Chrome version must be 70 and 73
  19. navicat 无法连接mysql10060错误
  20. FL Studio20.8完整版注册密钥下载有哪些新功能?

热门文章

  1. 各位 PHPer,Serverless 正当时
  2. OceanBase再破纪录!核心成员陈萌萌:坚持HTAP就是坚持我们做数据库的初心
  3. 基于DataWorks搭建新零售数据中台
  4. 技术干货 | 深度解构 Android 应用面临紧急发版时的救星方案:mPaaS 热修复——DexPatch
  5. 互联网下半场的角逐,玩转轻资产的大数据服务 | 阿里云栖开发者沙龙大数据专场(北京站)干货集锦
  6. Flutter Exception降到万分之几的秘密 1
  7. 在 react 里写 vue3 ? 还写了自定义 hooks和 Hoc 构建了响应式 !
  8. 低代码会让程序员更加内卷吗?
  9. 广东农信迁移上阿里云:系统建设从按月缩短至按天
  10. 商家笑了 设计师哭了,京东+英特尔的AI这招太绝