I’m using a QWebPage without a QWebView because I want to render the contents of an HTML file onto a QPixmap/QImage.
I want the loading of the page to be done synchronously, not asynchronously which is the default. The default way is to call QWebFrame::setHtml() or QWebFrame::setContent(), but this loads images asynchronously. What I want is some sort of blocking function call, something like QWebFrame::waitUntilLoadFinished() after which I could just call render() and be done with it.
I can’t find a way to do this. Am I missing something?
If anyone’s interested, I implemented this using a special “PageRasterizer” class.
The class creates a QWebPage in the constructor and sets a bool loading flag to false. A
connect()call connects theloadFinishedsignal to a member slot that merely sets the loading flag to true.A special
RenderPage()member function that returns an image does all the work: it accepts the HTML string and callssetHtml(). After that comes awhileloop that waits on the flag; while the flag is false,qApp->processEvents()is called so signals get emitted and the flag setting slot is eventually called. When it is, the loop breaks and now you can render the page to a QImage (don’t forget to set the flag back to false before returning).If you’re interested in the rendering process, look at this Qt example (the
Thumbnailer::render()function).For bonus points, you can make this class a functor.