Frage

Ich bin mit einem QWebPage ohne QWebView weil ich den Inhalt einer HTML-Datei auf einem QPixmap / QImage machen möge.

Ich möchte der Laden der Seite synchron zu tun, nicht asynchron, das ist die Standardeinstellung. Die Standardmethode ist QWebFrame::setHtml() oder QWebFrame::setContent() zu nennen, aber dies lädt Bilder asynchron. Was ich will, ist eine Art von Funktionsaufruf blockiert, so etwas wie QWebFrame::waitUntilLoadFinished() nach dem ich gerade render() nennen könnte und mit ihm getan werden.

Ich kann nicht einen Weg, dies zu tun finden. Bin ich etwas fehlt?

War es hilfreich?

Lösung 4

Wenn jemand interessiert, ich implementiert dies eine spezielle „PageRasterizer“ Klasse.

Die Klasse erstellt eine QWebPage im Konstruktor und setzt einen Bool Laden-Flag auf Falsch. Ein connect() Anruf verbindet das loadFinished Signal an einen Teilschlitz, der das Flag LOADING auf wahr setzt lediglich.

Eine spezielle RenderPage() Memberfunktion, die ein Bild zurück macht die ganze Arbeit: Sie nimmt den HTML-String und ruft setHtml(). Danach kommt eine while Schleife, die auf der Fahne wartet; während das Flag falsch ist, wird qApp->processEvents() so Signale ausgesendet und wird das Flag-Einstellung erhalten genannt Slot schließlich genannt. Wenn es heißt, die Schleife bricht und jetzt können Sie die Seite ein QImage machen (nicht vergessen die Flagge zurück auf false gesetzt vor der Rückkehr).

Wenn Sie in dem Rendering-Prozess interessiert sind, schauen Sie unter das Qt Beispiel (die Thumbnailer::render()-Funktion).

Für Bonuspunkte können Sie diese Klasse eine Funktors machen.

Andere Tipps

Wenn jemand es noch braucht, das ist, wie ich habe es funktioniert.

mWebPage->mainFrame()->setHtml("...");
QEventLoop loop;
connect(mWebPage,SIGNAL(loadFinished(bool)),&loop,SLOT(quit()));
loop.exec();
/* your webpage has finished loading & is ready to use */

Ich schlage vor, Sie die Qt Weise zu tun, und tun es async, hilft es, ein Los .

Falls Sie es noch in Sync zu tun, verwenden Sie QEventLoop in a seperate QThread .

Sehen Sie meinen Kommentar für detaillierte QThread Nutzungsinformationen. Hinweis: Vergessen Sie nicht moveToThread zu nennen (); innerhalb der Thread-Header oder alle Signale der QApplication Ausführungsschleife gehen.

Dieser Ansatz hat das Problem, dass man im Grunde für eine unbestimmte Menge an Zeit warten muß, und wenn Sie den Anruf vom Hauptthread sind ausstellende Sie Ereignisverarbeitung und damit Signale wie loadFinished sind blockiert.

Während Sie könnte um das zu erhalten, indem Ereignis explictly Pumpen, ich nicht ein inhärentes Problem sehen, dass Sie aus der Ausgabe der Seitenlade verhindern könnte und tun nur die Verarbeitung, wenn loadFinished aufgetreten.
Wenn Sie sekundäre Themen müssen für die Seite warten, können Sie immer diese Fäden durch Verwendung von Synchronisationsmechanismen warten lassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top