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 的示例:

#include <QMovie>
#include <QLabel>
#include <QTimer>
#include <QElapsedTimer>
#include <QApplication>

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("", nullptr);
    
    if (label) {
        // 在桌面居中显示
        label->setGeometry((window_with - gif_with) / 2, (window_hight - gif_hight) / 2, gif_with, gif_hight);
        label->setMovie(movie);
        label->setScaledContents(true);

        label->setWindowFlags(Qt::SplashScreen); // 设置为 SplashScreen, 窗口无边框,不在任务栏显示
        label->show();
        
        if (movie) movie->start();

        // 创建一个定时器,设定超时时间
        QTimer *timer = new QTimer(label);
        
        // 当定时器超时时,关闭标签和删除资源
        QObject::connect(timer, &QTimer::timeout, [=]() {
            label->close();
            if (movie) delete movie;
            delete label;
            timer->stop(); // 停止定时器
            timer->deleteLater(); // 延迟删除定时器对象
        });

        timer->start(time); // 启动定时器,设置超时时间

        // 处理事件循环,让窗口可交互,而不是使用阻塞的 while 循环。
        QApplication::processEvents();
    }
}

修改说明:

  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

注册

已经有帐号?