GUI von Datenbank erstellen

Alles rund um die Programmierung mit Qt
Antworten
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

GUI von Datenbank erstellen

Beitrag von NoRulez »

Hey @all,

ist es möglich eine GUI mittels einer Datenbank dynamisch zu erstellen (QLabels, QTextfields, QPushbuttons, ...) und falls ja, wie fange ich am besten damit an?

LG NoRulez
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

selbstverständlich geht das..... XML-Beschreibung (also den Inhalt der UI-Datei) als BLOB eintragen.. danach ungefähr:

Code: Alles auswählen

MyDbForm::MyDbForm(QWidget *parent)
     : QWidget(parent)
 {
     QFormBuilder builder;
     QBuffer uiData;
     uiData.setData(getBlobFromDb());  // SELECT data FROM uitable WHERE ... wasauchimmer
   
     QWidget *myWidget = builder.load(&uiData, this);

     QVBoxLayout *layout = new QVBoxLayout;
     layout->addWidget(myWidget);
     setLayout(layout);
 }
http://doc.trolltech.com/4.4/qformbuilder.html
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Wobei die Frage sehr viel Raum für Spekulationen lässt...
Meine geht in die Richtung
http://doc.trolltech.com/main-snapshot/ ... apper.html
in Kombination mit einem QSql(Relational)TableModel.
:D
Wer bietet mehr?
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

@solarix: Ich meinte es nur eben ohne XML, mir schwebt da eine art application server/n-tier vor, bei dem ich am client die gui basteln kann und die gui dann am server gespeichert wird.

LG NoRulez
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

solarix hat geschrieben:selbstverständlich geht das..... XML-Beschreibung (also den Inhalt der UI-Datei) als BLOB eintragen.
Nimmt man da nicht besser VARCHAR (bzw. TEXT/CLOB)?
BLOB ist doch binär (Binary Large Object), z.B. haut man da Bilder rein.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

NoRulez hat geschrieben:@solarix: Ich meinte es nur eben ohne XML, mir schwebt da eine art application server/n-tier vor, bei dem ich am client die gui basteln kann und die gui dann am server gespeichert wird.
Was willst du denn nehmen, wenn der Designer eh XML ausspuckt?
Ein (OS-abhängiges) binary/dll willst du doch da sicher nicht drinnen haben...

Oder wie wolltest du dir die UIs zusammen bauen?
Wenn du nicht die Qt-Bordmittel verwenden willst (designer + QUiLoader), musst du dir da was selber schreiben. Ein Dateiformat (Binär oder Text), eine Klasse bzw. auch mehrere zum schreiben und lesen der Datein, wobei das lesen dir ein QWidget liefert. Aber das wird eher komplizierter, drum solltest du schauen, wie du den Designer in dein Konzept integriert bekommst.

Du kannst dir ja überlegen, dass die UIs nur in einem bestimmten Verzeichnis gespeichert werden dürfen. Dieses Verzeichnis überwachst du mit einem QFileSystemWatcher. Auf Änderungen in dem Dir reagierst du entsprechend (ui am Server hochladen/aktualisieren/löschen).
Du kannst die bereits existierenden UIs auflisten, und für bearbeiten/löschen/neu erstellen gibts nen Button, der dir dann gleich mit dem passenden UI den Designer startet (QProcess::startDetached() z.B.).
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

franzf hat geschrieben:Nimmt man da nicht besser VARCHAR (bzw. TEXT/CLOB)?
BLOB ist doch binär (Binary Large Object), z.B. haut man da Bilder rein.
Weil VARCHAR lange Zeit auf 255 Zeichen beschraenkt war und auch TEXT erst seit neueren MySQL-Versionen (und davon reden wir hier vermutlich) existiert, wuerde ich BLOB bevorzugen.. ausserdem kann es mir damit egal sein, wie die Datei aufgebaut ist.. da lese ich einfach mit readAll ein QByteArray ein und schmeiss diesen in die DB... fertig :wink:
NoRulez hat geschrieben: Ich meinte es nur eben ohne XML, mir schwebt da eine art application server/n-tier vor, bei dem ich am client die gui basteln kann und die gui dann am server gespeichert wird.
Jaja.. ich habe dich schon richtig verstanden.. nur kann ich deinen Posts noch nicht so richtig die konkrete Frage entnehmen.. Dass du ein UserInterface nicht nur aus einer Datei sondern auch aus einer Datenbank laden kannst, duerfte beantwortet sein.

Wenn ich dich aber richtig verstehe, liegt dein Problem eher darin, die Daten dorthin zu bekommen... und genau da wird's knifflig. Ich habe mich auch mal damit beschaeftigt und bin zum gleichen Schluss wie franzf gekommen. Am einfachsten ist es, den Designer (das Programm, nicht den Code) in die eigene Applikation einzubinden. Meine Applikation speichert den Datenbankinhalt in eine temporaere Datei startet den Designer. Sobald die temporaeren Daten aendern speichere ich sie automatisch wieder zurueck in die DB... nicht sehr elegant, aber funktional.
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

Ich habe mal eine ganz andere Frage an den Anfang zu stellen: Willst du einfach nur den Inhalt der XML-Datei hochladen (da könnte man auch etwas anderes als einen Datenbankserver nehmen ;) ) oder willst du wirklich Element für Element einzeln mit seinen Eigenschaften in der Datenbank speichern. Ich weiß jetzt im Moment noch nicht, was das ganze für einen Sinn machen soll, vielleicht solltest du den genauen Sinn und Hintergrund deines Projektes mal erläutern...

Mfg androphinx
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Also es soll eine art application server werden, bei dem ich die GUI elemente in einer DB habe. Beim Laden hole ich mir mittels SQL Statements die verschiedenen elemente und baue so dynamisch meine GUI inkl. signals und slots auf. Hinter den slots liegen dann SQL Statements, die die beispielsweise ComboBox usw. mit Werten fühlen. Auf der anderen seite soll der client also ein mehr oder weniger dumme exe sein, die dynamisch vom server die GUI lädt. Somit rolle ich einmal das exe und ev. die DLL aus und verändere beispielsweise am server die GUI und alle ~ 50 Benutzer oder mehr sehen das selbe.

Als Beispiel bzw. Vorbild wäre Remedy gewesen.

LG NoRulez
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

auf der anderen seite soll der client also ein mehr oder weniger dumme exe sein, die dynamisch vom server die GUI lädt. Somit rolle ich einmal das exe und ev. die DLL aus und verändere beispielsweise am server die GUI und alle ~ 50 Benutzer oder mehr sehen das selbe.
Jep.. genau so machen wir's bei uns (GUI-Beschreibung in die Datenbank, Logik in Form von Plugins) .. ich habe nur noch nicht begriffen, was dir an der XML-Beschreibung (am UI-Format von Trolltech) nicht gefällt (warum denn was selbst erfinden, wenn es schon was fertiges gibt?)
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Und wie binde ich dann den designer bzw. signal slots in die GUI mit ein? Damit beispielsweise ein Admin neue funktionalität hinzufügen kann udgl.?

LG NoRuleZ
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Und wie binde ich dann den designer [..] in die GUI mit ein?
Wie ich den Designer eingebunden habe um die UI zu modifizieren, habe ich bereits geschrieben (Daten in tmp-Datei schreiben, designer starten, designer beenden, tmp-Datei wieder in DB eintragen).
Und wie [...] signal slots in die GUI...? Damit beispielsweise ein Admin neue funktionalität hinzufügen kann udgl.?
Da erntest du unweigerlich die typische "das-kommt-drauf-an..."-Antwort...
Schliesslich befindest du dich in der C++-Welt mit den diversen Binaries (Programm, Libraries, Plugins) welche gewissen Einschränkungen unterliegen und du uns nicht sagst, wie umfangreich deine "neue funktionalität" sein soll...

Einige Szenarien:

1. Qt-Plugins: die Applikation bietet spezifische Qt-Plugins,welche dann in der GUI nur noch konfiguriert werden müssen. Beispiel: diverse Datenbank-Plugins (auf Basis von QLineEdit, QCheckBox, QWidgetView & co), so dass ein "Admin" jederzeit Quellen und Attribute einer DB-Anwendung im Designer konfigurieren kann)

2. QtScript: Die Programmlogik wird in der Qt-eigenen Scriptsprache direkt in die UI eingetragen (also im Designer). Hier würde also UI+Logik im Designer erstellt und in die DB eingetragen. Da gibt's IMHO ein Taschenrechner-Beispiel...

3. GUI komplett in Script: Der komplette Code wird gescriptet.. man könnte ja auch PyQt nehmen und den Python-Code in die DB ablegen..

Das einzige was ich nicht tun würde, ist neben der UI auch noch das passende (plattformabhängige) Plugin in die DB einzutragen...

hth...
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Vorerst mal recht herzlichen Dank,

ich werde mich mal intensiver damit beschäftigen und die Implementierung nochmals genauer durchgehen/überlegen.

LG NoRulez

P.S.: Es war wie folgt gedacht, dass ich in einem TreeView meine GUI Elemente und somit die GUI Designe, danach soll mittels eines GraphicsView die slots grafisch dargestellt werden und konfiguriert werden => SIGNAL -> Holen der Daten/Benutzerereigniss auswerten/... -> SLOT

EDIT: Die logik soll nicht kompiliert werden sondern beispielsweise dynamisch aus dateien/Datenbanken kommen vermutlich reine Python/Perl/BASH skripte und anderen applikationen
Antworten