../mvc/mvc.html ../cpoo/cpoo.html


WebView QJson Json SOLR

Kleines Beispiel mit WebView, Zugriff auf eine Datenbank (DB) (über eine HTML-Schnittstelle, hier ist die DB SOLR),

d.h. die DB sendet eine HTML-Seite als Ergebnis (entweder in XML oder JSON Format) und diese Seite wird

dann mittels QJSON zerlegt und als Inhalt für das WebView und zwei TreeWidgets aufbereitet (nur skizziert).


Der Dialog (nur ein einfaches Beispiel)


Simpler Dialog mit QDesigner:

  • WebView: HTML-Seite mit dem Datenbank-Resultat ...
  • TreeWidgets: treewidget0 und treewidget1, erhalten Ergebnisse aus dem Datenbank-Resultat ...
  • LineEdit: Anfrage an Datenbank abschicken (nur skizziert) ...

  • update()-Methode von Beispielklasse dbdialog


    Bei einem Return im lineedit-Eingabefeld oder nach dem der GO-Button betätigt wurde,

    wird die update()-Methode von der Klasse dbdialog angesprungen.



    Die update()-Methode sieht so aus und macht folgendes:

  • http-request zusammenbauen (hier nur als simpler String skizziert)
  • Der DB-Zugriff kann bei dieser Datenbank über HTML erfolgen, daher wird der http-request als QURL ans WebView mit der Methode setUrl(..) gegeben
  • Der update()-call ans WebView ist überflüssig

  • Im Beispiel wird SOLR verwendet:

  • Einfacher Zugriff wie im SOLR-Dokument beschrieben, lediglich wird hier als "Browser" das WebView verwendet
  • Hat man SOLR ganz normal installiert, kann man einen Browser mit http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true ein Query ausführen
  • Das Query liefert dann eine Web-Seite mit Inhalt hier in JSON Format oder XML etc. - siehe hierzu auch die SOLR-Dokumentation
  • SOLR bietet umfangreiche Möglichkeiten, mein Focus liegt aber in diesem Beispiel auf dem QWebView von Qt5 und QJSON.

    Vermutlich funktioniert es mit jeder DB, die die Möglichkeit der Abfrage über http-request bereitstellt ...

    Um ein sinnvolles Ergebnis auf die Benutzereingabe zu liefern, wäre hier natürlich der Request noch mit der Benutzereingabe entsprechend zu ergänzen!


    connect( webview->page(), SIGNAL( loadFinished(bool) ), this, SLOT( slot_PageReady() ) )


    Der http-request wurde nun von webview an die Datenbank verschickt und diese sendet ihr Ergebnis als HTML-Seite wieder ans webview zurück.

    Um sinnvoll das Ergebnis weiterverarbeiten zu können, hat man das SIGNAL loadFinished(bool) mit einem SLOT zu verbinden.

    connect( webview->page(), SIGNAL( loadFinished(bool) ), this, SLOT( slot_PageReady() ) ) nimmt diese "Verdrahtung" vor.

    Ist das webview mit dem Laden der neuen Seite fertig, sendet es das SIGNAL, was nun in diesem Fall die Methode slot_PageReady() anspringt.

    (Während loadFinished(bool) genauso heißen muß, kann der Name für die Methode slot_PageReady() frei gewählt werden,

    muß aber in der betreffenden Klasse - hier dbdialog (in diesem Fall this) - gefunden werden.

    Findet Qt diese Methode nicht, passiert gar nichts. Connect, SIGNAL und SLOT sind Makros von Qt für dessen wichtigen Signal-Slot-Mechanismus.


    Mit webview->setUrl( QUrl::fromLocalFile( "D:/index.html" ) ); kann man übrigens nett eine Startseite von einem lokalen Pfad laden!


    Sequenzdiagramm zum Beispiel


    dbdialog ist der Dialog an sich, der natürlich auch das webview, lineedit und treewidget0/1 enthält.

    Hier ist das Beispiel nur für das lineedit-Eingabefeld dargestellt - natürlich kein Unterschied für GO-Button.

    Nach dem RETURN gepresst wurde, wird das SIGNAL returnPressed ausgelöst - es gibt hier keine "connect-Anmeldung",

    da diese "Verdrahtung" bereits in der ui-Datei für den Qt-Dialog im QDesigner bekannt gemacht wurde.


    Jedenfalls wird update()-Methode von dbdialog angesprungen, setUrl-Methode vom webview führt http-request zur Datenbank durch.

    Die Datenbank - in diesem Fall SOLR - führt das Query durch und reicht das Ergebnis als HTMl-Resultat ans webview zurück.


    webview sendet loadFinished, wodurch slot_PageReady angesprungen wird.

    Der extractor kann dann das Ergebnis mit QJSON oder für XML zerlegen und liefert das Ergebnis an die "Endabnehmer" (webview, treewidget0 und 1)

    In meiner wirklichen Lösung, liefert der extractor das Ergebnis an den dbdialog, damit der extractor die "Endabnehmer" gar nicht kennen muß.

    Ich hatte jetzt nur keine Lust nochmal mit DIA diese kleine Änderung zu malen, ich denke man kann es sich auch so vorstellen.

    Sicherlich läßt sich hier auch noch Nebenläufigkeit ins Spiel bringen, aber die Ausbeute dürfte gering sein und den Aufwand nicht lohnen.


    Zwischenergebnis


    Nur ein Zwischenergebnis für den Dialog ...


    Die Informationen extrahieren ...


    Die Informationen wird für manufactor und für category aus dem DB-HTML-Resultat geholt ...


    Das jeweilige treewidget wird dann im einfachsten Fall auf diese Weise befüllt.


    So sah das DB-HTML-Resultat im JSON Format aus (hieraus wurde dann die Information für die Treewidgets extrahiert).


    Oder DB-HTML-Resultat im XML Format (Qt bietet auch entsprechende XML-Klassen für die XML-Auswertung).


    Auch CSV ist bei SOLR möglich.



    Statt QWebView kann man auch QNetworkAccessManager verwenden, das ist dann etwas umständlicher, aber falls man den Inhalt nicht als HTML darstellen will ...

    QWebView ermöglicht einem auch JavaScript, CSS usw. einzusetzen ... (aus Zeitgründen blieb die Optik/Design des Dialogs einfach).

    Damit bin ich mit meinem kurzen Einblick in WebView (hier mit Qt5.4) QJson Json SOLR am Ende.


    =end of page=