11

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

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

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

4

4 回答 4

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 */
于 2013-05-24T17:56:54.517 回答
7

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

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

有关详细的 QThread 使用信息,请参阅我的评论。注意:不要忘记调用 moveToThread(); 在线程头中,否则所有信号都将通过 QApplication 执行循环。

于 2010-02-08T20:31:14.407 回答
2

这种方法的问题是您基本上必须等待不确定的时间,如果您从主线程发出调用,您将阻塞事件处理,因此发出类似loadFinished.

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

于 2010-02-05T15:19:48.770 回答
0

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

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

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

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

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

于 2010-02-05T18:24:14.873 回答