要将 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();
}
}
修改说明:
- 使用
QTimer
: 用QTimer
替代了阻塞的while
循环。它允许你在指定的时间后执行一些操作(例如关闭 GIF)。 - 连接信号和槽: 使用 lambda 表达式将
timeout()
信号与相应的处理函数连接,在超时时关闭标签并释放资源。 - 非阻塞调用: 没有使用任何形式的循环来保持应用程序响应,因此用户界面依旧可以正常工作。
注意事项:
- 确保你的 Qt 应用程序正确地管理内存,以避免内存泄漏。在这种情况下,我们在使用完对象后及时删除它们。
- 此代码段假设您正在一个已有的 Qt 环境中工作,例如 QWidget 或其他 QWidget 子类中的某个成员函数。
内容由零声教学AI助手提供,问题来源于学员提问