关于用QMovie播放GIF图片无法显示的问题

加盾男爵 2017-07-11 03:36:33
有一个类,执行某个函数是比较消耗时间(加载本地指定文件加下的图片,如果图片多的话可能需要3-5秒时间),为了应付这个情况,我打算在调用函数前显示一个GIF图片,调用完了就隐藏掉,

然后我使用一个QLabel来悬浮播放动态图片

label = new QLabel;
movies = QMovie(tr("E:/pix/load.gif"));
label->setMovie(movies);
labels->setWindowModality(Qt::ApplicationModal);//设定标签显示是为“模态”,保证执行函数是用户无法做其他操作


以上代码位于类的构造函数里,然后是那个比较耗时的函数

void loadPix()
{
labels->show();
labels->move(100.100);
// 加载图片的代码,执行完大概需要3-5秒
//...
labels->hide(); //执行完成后隐藏动态图
}

然后在主程序里如果调用这个loadPix()函数是,程序上面只会出现一个空白的标签,
然后我在类构造函数里添加了一句
labels->show()

然后主程序里不调用loadPix()函数,程序运行时标签能够正确的显示动态图片,请问下这个是什么情况
...全文
2285 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不关show跟hide的事,主线程需要显示ui界面,如果在主线程里面执行耗时操作,ui界面将会得不到刷新,因此耗时操作必须放到子线程里面去。在子线程中需要显示或隐藏时控件时通过信号发射给主线程,主线程用于显示或隐藏控件。1楼已经很明确说明方法了。如果对于起线程不熟悉,可以查看qt助手QThread的使用,一般是继承自QThread再重载run函数,或者使用movetothread方法将对象移到线程里面运行。
加盾男爵 2017-07-13
  • 打赏
  • 举报
回复
加盾男爵 2017-07-12
  • 打赏
  • 举报
回复
引用 1 楼 n7zj0x8 的回复:
所有的ui操作都是在主线程里面执行的,不管是绘制,刷新,显示,包括界面点击之类的 如果这些不在主线程里面执行会提示出错,有兴趣可以验证一下. 你这里加载资源也是在主线程里面的吧, 因为label要显示动态的gif,肯定要刷新. 如果现在主线程去加载资源去了, 就没有办法执行刷新.所以估计这是你没能显示gif的原因. 可以尝试把加载资源放到独立线程里面.通过信号和槽来操作gif的那个label
这个labels加载GIF图片是在构造函数里,在成员函数里只是对这个label进行show()和hide() 我试过如果不调用成员函数,对象生成是加载gif图片是可以正常显示的,然后调用成员函数,里面先show()在hide(),就不能显示了 我还试了下,在构造函数里添加两行代码,hide()和show(),然后不调用成员函数,gif图片也是可以正常显示的
大卫无限 2017-07-11
  • 打赏
  • 举报
回复
所有的ui操作都是在主线程里面执行的,不管是绘制,刷新,显示,包括界面点击之类的 如果这些不在主线程里面执行会提示出错,有兴趣可以验证一下. 你这里加载资源也是在主线程里面的吧, 因为label要显示动态的gif,肯定要刷新. 如果现在主线程去加载资源去了, 就没有办法执行刷新.所以估计这是你没能显示gif的原因. 可以尝试把加载资源放到独立线程里面.通过信号和槽来操作gif的那个label

16,210

社区成员

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

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