ZBLOG

修改为线程或者定时器 ,不能阻塞void showGIF(qint16 window_with,qint16 window_hight,qint16 gif_with = 320,qint16 gif_hight = 320,qint32 time = 20000) { //引用资源文件 QMovie *movie = new QMovie(":/GIF/03.gif"); QLabel *label=new QLabel ("", 0); if(label...

要将 showGIF 函数改为使用线程或定时器而不阻塞主线程,可以利用 QTimer 来实现。在这个修改后的版本中,您可以在定时器的超时信号中关闭标签,并在指定的时间后停止 GIF 动画。以下是一个基于 QTimer 的示例:

  1. #include <QMovie>
  2. #include <QLabel>
  3. #include <QTimer>
  4. #include <QElapsedTimer>
  5. #include <QApplication>
  6. void showGIF(qint16 window_with, qint16 window_hight, qint16 gif_with = 320, qint16 gif_hight = 320, qint32 time = 20000)
  7. {
  8. // 引用资源文件
  9. QMovie *movie = new QMovie(":/GIF/03.gif");
  10. QLabel *label = new QLabel("", nullptr);
  11. if (label) {
  12. // 在桌面居中显示
  13. label->setGeometry((window_with - gif_with) / 2, (window_hight - gif_hight) / 2, gif_with, gif_hight);
  14. label->setMovie(movie);
  15. label->setScaledContents(true);
  16. label->setWindowFlags(Qt::SplashScreen); // 设置为 SplashScreen, 窗口无边框,不在任务栏显示
  17. label->show();
  18. if (movie) movie->start();
  19. // 创建一个定时器,设定超时时间
  20. QTimer *timer = new QTimer(label);
  21. // 当定时器超时时,关闭标签和删除资源
  22. QObject::connect(timer, &QTimer::timeout, [=]() {
  23. label->close();
  24. if (movie) delete movie;
  25. delete label;
  26. timer->stop(); // 停止定时器
  27. timer->deleteLater(); // 延迟删除定时器对象
  28. });
  29. timer->start(time); // 启动定时器,设置超时时间
  30. // 处理事件循环,让窗口可交互,而不是使用阻塞的 while 循环。
  31. QApplication::processEvents();
  32. }
  33. }

修改说明:

  1. 使用 QTimer: 用 QTimer 替代了阻塞的 while 循环。它允许你在指定的时间后执行一些操作(例如关闭 GIF)。
  2. 连接信号和槽: 使用 lambda 表达式将 timeout() 信号与相应的处理函数连接,在超时时关闭标签并释放资源。
  3. 非阻塞调用: 没有使用任何形式的循环来保持应用程序响应,因此用户界面依旧可以正常工作。

注意事项:

  • 确保你的 Qt 应用程序正确地管理内存,以避免内存泄漏。在这种情况下,我们在使用完对象后及时删除它们。
  • 此代码段假设您正在一个已有的 Qt 环境中工作,例如 QWidget 或其他 QWidget 子类中的某个成员函数。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20859

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?