Seite 1 von 1

WebView: "Open in new window"

Verfasst: 14. Oktober 2009 22:58
von rabby
Hi,

seit längerem beschäftige ich mit damit, in einer C++ Anwendung ein HTML Dokument mit dem QT WebKit -> WebView Objekt anzuzeugen.

U.a. auch http://doc.qt.nokia.com/4.5/qwebview.html
Dort finde ich auch die Textstelle "If you want to provide support for web sites that allow the user to open new windows, such as pop-up windows, you can subclass QWebView and reimplement the createWindow() function.".

Gerne würde ich die URL anzeigen, wenn jemand einen Link in einem neuen Fenster öffnen möchte. Das passiert im WebView Objekt durch Mausklick-rechts und "Open in new window" oder wenn ein target="_blank" Link oder javascript eine neue Seite öffnen möchte.
Derzeit passiert gar nichts, wenn versucht wird, einen Link in einem neuen Fenster zu öffnen.
Gemäß dem obigen Zitat von der Dokumentation sollte ich es mit createWindow versuchen. Das habe ich getan und bin daran gescheitert, dass dieser Funktion die URL zu keinem Zeitpunkt übergeben wird, siehe
QWebView * QWebView::createWindow ( QWebPage::WebWindowType type

Könnt Ihr mir bitte verraten, wie ich die URL abgreifen kann?

Danke für Eure Hilfe

Verfasst: 15. Oktober 2009 07:35
von andy72
Moin,

... Du musst in der createWindow(...)-Funktion eine neue Instanz einer QWebView erzeugen, und diese als return-Wert zurück geben.

Ich habe das bei mir so gelöst, dass ich (an meine TabView-Klasse) ein Signal
sende, das als Funktionsargument einen Zeiger die neue Instanz enthält.
Somit kann ich in dem entsprechenden SLOT diese QWebView in einen Tab packen oder in einem Fenster öffnen.
Die Url ist zu diesem Zeitpunkt als url() in der QWebView abrufbar.

Willst Du ein neues Fenster öffnen, musst Du natürlich eine Ebene höher gehen und deine QApplication bzw Dein mainWindow neu instanzieren.

LG
Andy

Verfasst: 15. Oktober 2009 11:39
von rabby
Hi,

danke für Deine Antwort.
Also das klingt vielversprechend, aber eine Unklarheit besteht weiterhin.

Innerhalb von createWindow erstelle ich nun also eine neue Instanz von QWebView, die mit return zurückgegeben wird.
Wie und wo frage ich nun am besten die ->url() ab. Vor dem return in createWindow wird die URL wohl noch nicht gesetzt sein.
Muss dazu nun noch eine vererbbare Funktion der neuen QWebView Instanz überschrieben werden?

Danke

PS: Deine Anwendung ist nicht zufällig OpenSource? ;-) Dann könnte ich es selbst nachlesen...

Verfasst: 17. Oktober 2009 12:39
von andy72
Hi,

also "wann" die url() in der QWebView verfügbar ist kann ich Dir auch nicht sagen. Meine Funktion läuft folgend ab:

In der QTabView gibt es einen SLOT, der auf das oben beschriebene Signal reagiert:

Code: Alles auswählen

void MY_CLASSNAME::openTab(QWebView *view) {
  addTab(view, QLatin1String("Unknown"));
}
zu diesem Zeitpunkt wird die URL der QWebView ja schon selbstständig aufgerufen - ob da eine drin ist oder nicht, geht mich nichts an da das
wiederrum der QNetworkAccessManager regelt ob da was zu holen ist ;)

Aber ich denke, dass zu diesem Zeitpunkt eine URL da ist sonst würde in der Anwendung ja nichts passieren ...

Mein Code ist natürlich OSS - ich arbeite seit 2 Jahren ausschliesslich mit Ubuntu (obwohl etwas sehr angepasst auf meine eigenen Bedürfnisse).
Bei Fragen diesbezüglich: PN an mich, dann schick ich dir meinen Browser mal :)

LG

Verfasst: 3. März 2010 09:10
von smudo
hallo rabby

hast Du das Problem lösen können? Ich stehe nämlich vor der gleichen Herausforderung: da ist ein Button mit window.open(...) und ich habe die Methode createWindow(Type...) auch implementiert, bekomme aber (und in meinen Augen logischerweise) ein leeres neues Fenster angezeigt, wenn ich eine neue Instanz von QWebView erzeuge und zurück gebe.

Verfasst: 3. März 2010 12:42
von smudo
smudo hat geschrieben:hallo rabby

hast Du das Problem lösen können? Ich stehe nämlich vor der gleichen Herausforderung: da ist ein Button mit window.open(...) und ich habe die Methode createWindow(Type...) auch implementiert, bekomme aber (und in meinen Augen logischerweise) ein leeres neues Fenster angezeigt, wenn ich eine neue Instanz von QWebView erzeuge und zurück gebe.
ich bin ein Grautier!!
Man muss den Namen der HTML-Datei, die per Popup geöffnet werden soll auch richtig schreiben! Dann klappts!