为了确保 GIF 可以播放而不会阻塞后续程序,可以使用定时器或线程来管理 GIF 播放。下面的代码展示了如何使用 QTimer 来非阻塞地显示 GIF,并在指定时间后关闭它。
使用 QTimer 的示例代码
以下是更新后的 showGIF 函数,利用 QTimer 处理 GIF 播放而不阻塞主线程:
#include <QApplication>
#include <QLabel>
#include <QMovie>
#include <QTimer>
#include <QDebug>
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");
    
    if (!movie->isValid()) {
        qDebug() << "Failed to load GIF file.";
        delete movie; // 删除无效对象以避免内存泄漏
        return;
    }
    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,无边框窗口,不在任务栏显示
        
        movie->start(); // 启动动画
        label->show(); // 显示标签
        // 创建一个定时器,设定超时时间 
        QTimer *timer = new QTimer(label);
        QObject::connect(timer, &QTimer::timeout, [=]() {
            label->close();
            delete movie;
            delete label;
            timer->stop(); 
            timer->deleteLater(); 
        });
        timer->start(time); // 启动定时器
        QApplication::processEvents(); // 保持应用响应 
    }
}
核心修改点:
- 使用 
QTimer:创建了一个QTimer对象来处理延迟关闭的逻辑。 - 信号与槽连接:通过连接 
timeout()信号和相关槽,当达到预设时间后,关闭窗口并释放资源。 - 非阻塞设计:整个过程不会阻塞主线程,从而保证其他事件仍然可以被处理。
 
注意事项:
- 确保将此函数放入合适的上下文中,例如 Qt 的主窗口或其他 UI 元素中,以确保它能正确显示。
 - 如果需要进一步优化,请根据具体项目需求调整代码结构和资源管理。
内容由零声教学AI助手提供,问题来源于学员提问 


        
        
        
        
        
        
        
        
        
        
                
                
                
                
                
                
                