我正在使用没有QWebView的QWebPage,因为我想将HTML文件的内容呈现到QPixmap / QImage上。
我想要同步完成页面的加载,不是是异步的,这是默认的。默认方式是调用QWebFrame::setHtml()
或QWebFrame::setContent()
,但这会异步加载图像。我想要的是某种阻塞函数调用,类似于QWebFrame::waitUntilLoadFinished()
,之后我可以调用render()
并完成它。
我找不到办法做到这一点。我错过了什么吗?
答案 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 example(Thumbnailer::render()
函数)。
对于奖励积分,您可以将此课程变为算子。