QComboBox mit Datenbank füttern
-
Hey Community!
Ich übe mich momentan in Qt und C++ ein und wollte eine Übungsdatenbank programmieren. Als Treiber verwende ich QSQLite.
Zuerst einmal ein paar Infos zu meiner Datenbankanwendung:
Es existieren 3 Tabellen.- für die Kunden,
- für Fahrzeuge und
- für die Rechnungen.
In der Tabelle mit den Rechnungen werden die Käufe der Kunden gespeichert - also die ID des Kunden und die ID es Fahrzeugs und das Datum.
In meiner Anwendung gibt es bis jetzt die Möglichkeit Kunden und Fahrzeuge anzulegen und zu editieren. Das Anlegen neuer Einträge übernimmt die Klasse QSqlTableModel welches ich mittels der Methode setData() mit den ensprechenden LineEdits verbinde.
Die Datenbankeinträge werden in einem QTableView wiedergegeben. Das habe ich realisiert indem ich die Methode setModel() der Klasse QTableView das entsprechende Objekt der Klasse QSqlTableModel übergebe.
Nun zu meinem Problem Nr. 1:
ich habe zwei ComboBoxen auf das Formular "gemalt" (außerhalb des TableViews) und möchte nun, das in der einen ComboBox sämtliche Kunden aufgelistet werden und in der anderen ComboBox sämtliche Fahrzeuge, so dass ich beim anlegen einer Rechnung den Kundennamen und das Fahrzeug in der ComboBox auswählen kann. Die Anwendung legt dann dementsprechend eine neue Rechnung an. Gespeichert werden, sollen wir gesagt nur die enstprechenden IDs.Zu meinem Problem Nr. 2:
Als nächstes möchte ich das TableView erweitern, indem dort nicht nur die Kunden-ID und die Fahrzeug-ID angezeigt wird (was ja nicht gerade benutzerfreundlich ist), sondern zusätzlich noch der Kundenname (Vorname + Nachname) und der Fahrzeugname (Marke + Modell). Die Namen und Fahrzeuge sollen natürlich nicht mit in die Tabelle für die Rechnungen gespeichert werden, sondern es sollen nur die ID's gespeichert werden und meine Anwendung sucht sich dann in den Tabellen mit den Kunden und Fahrzeugen die Informationen zur Anzeige für das TableView heraus.Ein paar Screenshots:
Rechnungen
https://www.bilder-upload.eu/bild-e2ce8e-1589805446.png.htmlKunden
https://www.bilder-upload.eu/bild-20a707-1589805791.png.htmlFahrzeuge
https://www.bilder-upload.eu/bild-58d1ab-1589805847.png.htmlIch hoffe ich konnte mein Problem deutlich genug schildern.
ich freue mich auf Eure Antworten!
-
Was ist denn deine konkrete Frage? Wie eine ComboBox mit Werten aus einer SQLite-Datenbank gefüllt wird?
Dann schau mal in Populate a Qt combo box from a database table in PyQt (ist zwar mit Python, aber interessant sind ja nur die Namen der aufgerufenen Funktionen: im Code unter dem Kommentar "# Create combo and set its model").
-
@Th69m, richtig verstanden. Danke für den Link, ich werde mich da mal mit meinen - eher bescheidenen - Englischkenntnissen reinfuchsen, ich meld mich dann nochmal.
-
Geile Sache, es funktioniert! - und das mit nur zwei Zeilen Code! Jetzt muss ich es nur noch hinbekommen, Vornamen und Nachnamen zu verbinden bzw. in der ComboBox anzeigen zu lassen.
Danke nochmal
-
Kennt jemand eine Möglichkeit, mehrere Spalteneinträge zusammenzutragen um sie dann in eine ComboBox zu tun?
In dem Link von Th69 wird gezeigt, wie man Einträge aus einer Tabelle in eine ComboBox hinzufügt. Das klappt auch, nun möchte ich aber mehrere Einträge addieren, also z.B.möchte ich nicht nur den Vornamen in der ComboBox hinzufügen, sondern auch die Nachnamen wie z.B: "Max Mustermann", ein einzelner ComboBox-Eintrag würde dann also aus Vorname + Nachname bestehen.
-
Da kannst du die QComboBox::setItemDelegate-Funktion benutzen, um die String-Konkatenation durchzuführen. Habe auch nur wieder ein Python-Beispiel gefunden: Return multiple columns in QComboBox (s. Antwort dort).
Du mußt also eine eigene Klasse von QStyledItemDelegate ableiten und dort dann initStyleOption überschreiben.Für C++ habe ich noch Grouped QComboBox als Beispiel gefunden, aber hier wird nur gezeichnet (nicht das Modell abgeändert).
Eine andere Möglichkeit wäre es eine sog. "calculated column" (berechnete Spalte) im Model hinzuzufügen, aber da habe ich (bisher) keine Links mit Code dazu gefunden.
-
Super, danke für Deine Hilfe! Ich werde es mal versuchen