QtWebkit同步加载

Luc*_*cas 11 c++ qt qtwebkit

我正在使用没有QWebView的QWebPage,因为我想将HTML文件的内容呈现到QPixmap/QImage上.

我希望页面的加载是同步完成的,而不是异步的,这是默认的.默认方式是调用QWebFrame::setHtml()QWebFrame::setContent(),但这会异步加载图像.我想要的是某种阻塞函数调用,就像QWebFrame::waitUntilLoadFinished()之后我可以调用render()它并完成它.

我找不到办法做到这一点.我错过了什么吗?

Jay*_*nki 8

如果有人仍然需要它,这就是我的工作方式.

mWebPage->mainFrame()->setHtml("...");
QEventLoop loop;
connect(mWebPage,SIGNAL(loadFinished(bool)),&loop,SLOT(quit()));
loop.exec();
/* your webpage has finished loading & is ready to use */
Run Code Online (Sandbox Code Playgroud)


dra*_*hnr 7

我建议你用Qt方式做它并做异步,它有很大帮助.

如果您仍想在同步中执行此操作,在单独的QThread中使用QEventLoop.

有关详细的QThread使用信息,请参阅我的评论.注意:别忘了调用moveToThread(); 在线程头内,或者所有信号都将通过QApplication执行循环.

  • 有关正确使用QThread的信息,请参阅http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/ (2认同)

Luc*_*cas 0

如果有人感兴趣,我使用特殊的“PageRasterizer”类来实现这一点。

该类在构造函数中创建一个 QWebPage 并将布尔加载标志设置为 false。调用将信号connect()连接loadFinished到仅将加载标志设置为 true 的成员槽。

返回图像的特殊RenderPage()成员函数完成所有工作:它接受 HTML 字符串并调用setHtml(). 之后是while等待标志的循环;当标志为 false 时,qApp->processEvents()将被调用,以便发出信号并最终调用标志设置槽。如果是这样,循环就会中断,现在您可以将页面渲染到 QImage(不要忘记在返回之前将标志设置回 false)。

如果您对渲染过程感兴趣,请查看此 Qt 示例Thumbnailer::render()函数)。

为了获得奖励积分,您可以将此类设为函子。