我正在使用QWebPage而不是QWebView,因为我想将HTML文件的内容渲染到QPixmap/QImage上。
我想同步加载页面,而不是异步加载(这是默认设置)。默认方式是调用QWebFrame::setHtml()
或QWebFrame::setContent()
,但这会异步加载图片。我需要一种阻塞函数调用的方式,类似于QWebFrame ::waitUntilLoadFinished()
,然后我只需调用render()
即可完成。
我找不到这样的方法。我错过了什么吗?
mWebPage->mainFrame()->setHtml("...");
QEventLoop loop;
connect(mWebPage,SIGNAL(loadFinished(bool)),&loop,SLOT(quit()));
loop.exec();
/* your webpage has finished loading & is ready to use */
如果您仍然想以同步方式进行操作,请在单独的QThread中使用QEventLoop。
有关详细的QThread使用信息,请参见我的评论。 注意:不要忘记在线程头中调用moveToThread();,否则所有信号都将通过QApplication执行循环。
如果有人感兴趣,我使用了一个特殊的“PageRasterizer”类来实现这个功能。
该类在构造函数中创建一个QWebPage,并将一个bool类型的loading标志设置为false。一个connect()
调用将loadFinished
信号连接到一个成员槽,该槽仅将loading标志设置为true。
一个特殊的RenderPage()
成员函数执行所有工作并返回图像:它接受HTML字符串并调用setHtml()
。然后是一个while
循环,等待标志;当标志为false时,调用qApp->processEvents()
以便信号被发射并最终调用标志设置槽。当它被调用时,循环就会中断,现在你可以将页面渲染为QImage(在返回之前不要忘记将标志重新设置为false)。
如果您对渲染过程感兴趣,请查看this Qt example(Thumbnailer::render()
函数)。
为了加分,您可以将这个类变成一个functor。