在QLabel中使用GIF动画的QMovie存在问题

3
我已经搜索了一些解决方案,但都没有用......我在一个QLabel中使用了一个带有GIF动画的QMovie来表示加载状态,好吗?这很简单,我是从这个链接学到的。当我打开菜单时(例如,拥有一个标签),将QMovie放入该菜单的QLabel中时,它可以完美地工作。
现在我的问题是,我为加载状态创建了一个特定的UI,当我知道某些UI打开会很慢时,我会显示我的加载状态UI;当UI打开结束后,我会关闭我的加载状态UI。在这个加载状态UI中,我放置了一个QMovie(GIF动画)和一个简单的标签“Loading...”,非常简单,对吧?但是,当我使用这个特定的UI时,QMovie不起作用。实际上,它不能保持循环......你看,当我在正在打开的UI中使用QMovie时,QMovie会保持循环。
我的英语不是很好,但您能理解我的问题吗? = /
我正在使用与链接中相同的代码。
this->m_pMovie = new QMovie(":/ui/images/my_image_loading.gif");
this->m_pMovie->setScaledSize(QSize(50, 50));
this->ui->labelImageLoading->setMovie(this->m_pMovie);
this->m_pMovie->start();

有人了解这个吗?

谢谢...

1个回答

3
一切看起来你使用QMovie的方式都没有问题。但我猜测你的QMovie之所以没有更新可能是因为GUI线程过于繁忙。如果你的UI加载缓慢,那么这种缓慢可能是因为GUI线程上的大量处理而导致的。而这个线程也是尝试更新你的QMovie的“同一个”线程。结果: 你的QMovie永远不会被更新,因为它依赖于相同的GUI线程来绘制其更新。
如果在UI加载过程中任何地方你能够调用几次QApplication :: processEvents(),这将使电影得到更新。但它可能会很卡顿。
否则,除了尝试找到一种方法使这些UI加载速度更快(将它们分成不同的窗口、简化布局、分解成按需加载的选项卡等)外,真的没有什么办法了。

我明白了@Dave...我确实使用了QApplication::processEvents(),但是忘记在这里写了。好吧,使用processEvents()方法,我的带有QMovie的QLabel被显示出来,但动画仍然保持静态。但现在我明白了为什么...因为我正在打开的新UI和我的加载状态UI都在同一个线程中,即GUI线程,对吗?感谢您的解释!我将寻找另一种解决方案,但我相信将不可能使用我的GIF作为加载状态,因为另一个问题是如果我打开另一个线程,我也无法在UI中绘制... - Adriano Leal
一个解决方案是生成一个全新的 QProcess,启动一个“等待中...”的应用程序。然后在 UI 加载完成后杀死该进程。这样你就有了两个 GUI 线程(在两个不同的进程中)。当然,这也会带来自己的问题,并且有点繁重。但如果没有办法缩短主 UI 的加载时间,这可能是可行的。 - Dave Mateer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接