QWebView等待加载

QWebView Wait for load

本文关键字:加载 等待 QWebView      更新时间:2023-10-16
bool MainWindow::waitForLoad(QWebView& view)
{
    QEventLoop loopLoad;
    QTimer timer;
    QObject::connect(&view, SIGNAL(loadFinished(bool)), &loopLoad, SLOT(quit()));
    QObject::connect(&timer, SIGNAL(timeout()), &loopLoad, SLOT(quit()));
    timer.start(timeout);
    loopLoad.exec();
    if(!timer.isActive())
    {
        timer.stop();
        view.stop();
        return false;
    }
    return true;
}

告诉我,这是一个正确的代码吗?应用程序有时会在

行后冻结
loopLoad.exec();

并且总是返回true,即使这里发生了一些问题(超时,加载错误,等-总是true)。

start(timeout);启动定时器,超时时间间隔为msec毫秒。因此,在调用它之后,计时器正在运行,timer.isActive()总是返回true,并且if块不被执行。

你应该在loadFinished被触发时停止计时器:

QObject::connect(&view, SIGNAL(loadFinished(bool)), &timer, SLOT(stop()));

如果计时器是活动的,则事件循环被计时器停止,因此您应该返回false,因为超时已经发生。你应该用if(timer.isActive())代替if(!timer.isActive())

正确的代码是:

bool MainWindow::waitForLoad(QWebView& view)
{
    QEventLoop loopLoad;
    QTimer timer;
    QObject::connect(&view, SIGNAL(loadFinished(bool)), &loopLoad, SLOT(quit()));
    QObject::connect(&view, SIGNAL(loadFinished(bool)), &timer, SLOT(stop()));
    QObject::connect(&timer, SIGNAL(timeout()), &loopLoad, SLOT(quit()));
    timer.start(timeout);
    loopLoad.exec();
    if(timer.isActive())
    {
        timer.stop();
        view.stop();
        return false;
    }
    return true;
}