如何通过一个GIF图片来掩饰对话框创建时间?

加盾男爵 2017-12-18 10:16:14
现在程序里有个对话框,他创建的时候回比较消耗时间,根据不同电脑需要花费大约3-5秒时间,所以希望在这个对话框new之前播放一个gif图片,当new完成之后隐藏gif并显示对话框
gif类似这样

计划A:直接在new之前放一个QLabel播放gif;
void LoadDialog::createDialog()
{
QLabel* gif_Label = new QLabel;
QMovie* gif_Movie = new QMovie(tr("E:/pixs/loading.gif"));
gif_Label->setFixedSize(100,100);
gif_Label->setMovie(gif_Movie);
gif_Movie->start();
gif_Label->show(); //设想这里可以播放gif

if(costTime_Dialog != NULL)
delete costTime_Dialog;
costTime_Dialog = new CostTimeDialog(this);//这行代码需要花费3-5秒时间
delete gif_Label;
costTime_Dialog->exec();
}

结果:QLabel是跳出来了,但上面一片空白,没有GIF图像,3-5秒后QLabel消失,对话框跳出来

计划B:使用QSplashScreen类,查了下QSplashScreen无法播放gif图片(可能我没查到准确的,反正我没有成功实现)

计划C:退而求其次,我想用个QLabel显示一行字“登录中。。。”

QLabel* info_Label = new QLabel;
info_Label->setFixedSize(200,100);
info_Label->setText("登录中。。。");
info_Label->show();
if(costTime_Dialog != NULL)
delete costTime_Dialog;
costTime_Dialog = new CostTimeDialog(this);
delete gif_Label;
costTime_Dialog->exec();

结果:和计划A一样,QLabel跳出来了,上面没有文字,一片空白,然后3-5秒后QLabel消失,对话框跳出来了
我想问下,如何先显示一个gif,然后在开始生产一个(比较费时)的对话框,生产完了删掉gif,然后显示对话框
...全文
275 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
张小飞Official 2017-12-22
  • 打赏
  • 举报
回复
一开始显示label,走到widget的exec函数,再把上边的那个label去掉不就可以了么。然后这个Widget也创建完了
张小飞Official 2017-12-22
  • 打赏
  • 举报
回复
我建议你重写这个widget的exec函数,里边有个QEventLoop循环来解决这个问题。
雲天之巔 2017-12-22
  • 打赏
  • 举报
回复
引用 3 楼 ch122633 的回复:
[quote=引用 2 楼 qazaq408 的回复:] [quote=引用 1 楼 ch122633 的回复:] 不是有个QProgressDialog么,要不你看看。 或许能加个QLabel,那样你就可以控制图片了。 QProgressDialog支持计数、计时间来控制进度条
我查到的资料是,QT所有的窗体都只能位于主线程中,也就是说,
costTime_Dialog = new CostTimeDialog(this);
这句代码是生成一个窗体,所以肯定这句代码肯定会在主线程中执行,因此执行这句代码时候可以看做主线程被阻塞了,所以gif图片在这段时间里没法显示(gif用QLabel显示,也属于窗体,也位于主线程中),使用QProgressDialog,GIF在这段时间里不会动,处于停止状态[/quote] 怎么说呢,我是这样实现的

QProgressDialog drawProgress(tr("图像绘制进度"), tr("取消"), 0, sqlRow, this);
drawProgress.show();
for(uint i=0;i<sqlRow;i++)
    {
        /* 做一些数据处理 */

        drawProgress.setValue(i);
        QCoreApplication::processEvents();
        if(drawProgress.wasCanceled())
        {
            /* 按了取消的情况 */
            break;
        }
        /* 显示界面的处理 */
    }
sqlRow是界面要处理的数据行数[/quote] 解决方法应该是 把这个for循环放入线程 可以很负责任的告诉你:别的任何方法都行不通。
Little柯南 2017-12-21
  • 打赏
  • 举报
回复
1、我有个提议!你3秒才能创建的dialog我把他记作DialogB,刚开始的等待画面记作DialogA(当然也可以作为label播放gif),那么看下来的,这才是主要说的: DialogA播放gif完毕,DialogB就开始加载好了,所以要在做个信号槽关联,在DialogB的构造函数最后一句自定义信号:emit DialogBCreated(),让他关联DialogA的close函数作为槽。另外,如果你DialogA如果将this作为父对象指针,其实根据Qt元对象系统,你可以不必delete 这个DialogA。同时,movie->start()与label->show()或许逻辑上先是label->show(),然后movie->start().。 之所以这里用DialogA,意思是你可以自定义也可以扩展,就像前面说的使用ProgressDialog()也同样可以。 2、绝对解决问题的方式:创建继承QThread的线程,里面让label播放动画,详细过程,给你贴个地址,你去看: http://www.cnblogs.com/tlsdba/archive/2012/06/27/2565559.html
走好每一步 2017-12-21
  • 打赏
  • 举报
回复
耗时的操作放线程里做,不要放在对话框的槽函数里执行,你都把UI线程阻塞了,那肯定是显示不了动画了。
习惯就好zz 2017-12-19
  • 打赏
  • 举报
回复
引用 2 楼 qazaq408 的回复:
[quote=引用 1 楼 ch122633 的回复:] 不是有个QProgressDialog么,要不你看看。 或许能加个QLabel,那样你就可以控制图片了。 QProgressDialog支持计数、计时间来控制进度条
我查到的资料是,QT所有的窗体都只能位于主线程中,也就是说,
costTime_Dialog = new CostTimeDialog(this);
这句代码是生成一个窗体,所以肯定这句代码肯定会在主线程中执行,因此执行这句代码时候可以看做主线程被阻塞了,所以gif图片在这段时间里没法显示(gif用QLabel显示,也属于窗体,也位于主线程中),使用QProgressDialog,GIF在这段时间里不会动,处于停止状态[/quote] 怎么说呢,我是这样实现的

QProgressDialog drawProgress(tr("图像绘制进度"), tr("取消"), 0, sqlRow, this);
drawProgress.show();
for(uint i=0;i<sqlRow;i++)
    {
        /* 做一些数据处理 */

        drawProgress.setValue(i);
        QCoreApplication::processEvents();
        if(drawProgress.wasCanceled())
        {
            /* 按了取消的情况 */
            break;
        }
        /* 显示界面的处理 */
    }
sqlRow是界面要处理的数据行数
加盾男爵 2017-12-19
  • 打赏
  • 举报
回复
引用 1 楼 ch122633 的回复:
不是有个QProgressDialog么,要不你看看。 或许能加个QLabel,那样你就可以控制图片了。 QProgressDialog支持计数、计时间来控制进度条
我查到的资料是,QT所有的窗体都只能位于主线程中,也就是说,
costTime_Dialog = new CostTimeDialog(this);
这句代码是生成一个窗体,所以肯定这句代码肯定会在主线程中执行,因此执行这句代码时候可以看做主线程被阻塞了,所以gif图片在这段时间里没法显示(gif用QLabel显示,也属于窗体,也位于主线程中),使用QProgressDialog,GIF在这段时间里不会动,处于停止状态
习惯就好zz 2017-12-18
  • 打赏
  • 举报
回复
不是有个QProgressDialog么,要不你看看。 或许能加个QLabel,那样你就可以控制图片了。 QProgressDialog支持计数、计时间来控制进度条

16,240

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧