为了确保 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助手提供,问题来源于学员提问