QtWebkit同步加载

时间:2010-02-05 14:32:47

标签: c++ qt qtwebkit

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

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

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

4 个答案:

答案 0 :(得分: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 */

答案 1 :(得分:7)

我建议你以Qt方式执行此操作并执行异步操作,它有助于批次

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

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

答案 2 :(得分:2)

这种方法有一个问题,你基本上必须等待一段不确定的时间,如果你从主线程发出呼叫,你就阻止事件处理,因此发出像loadFinished这样的信号。

虽然你可能通过明确地抽取事件来解决这个问题,但我没有看到一个固有的问题,可能会阻止你发出页面加载,只是在loadFinished时进行处理发生。
如果您需要辅助线程来等待页面,您可以始终让这些线程使用同步机制等待。

答案 3 :(得分:0)

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

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

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

如果您对渲染过程感兴趣,请查看this Qt exampleThumbnailer::render()函数)。

对于奖励积分,您可以将此课程变为算子。