11

HTMLファイルのコンテンツをQPixmap/QImageにレンダリングしたいので、QWebViewなしでQWebPageを使用しています。

ページの読み込みを、デフォルトである非同期ではなく、同期的に実行する必要があります。QWebFrame::setHtml()デフォルトの方法はまたはを呼び出すことです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の方法で実行し、非同期で実行することをお勧めします。これは非常に役立ちます

それでも同期で実行したい場合は、別の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、フラグを待機するループが発生します。フラグがfalseの場合qApp->processEvents()に呼び出されるため、信号が送信され、最終的にフラグ設定スロットが呼び出されます。そうである場合、ループは中断され、ページをQImageにレンダリングできるようになります(戻る前にフラグをfalseに戻すことを忘れないでください)。

レンダリングプロセスに興味がある場合は、このQtの例Thumbnailer::render()関数)を見てください。

ボーナスポイントについては、このクラスをファンクターにすることができます。

于 2010-02-05T18:24:14.873 に答える