Hallo zusammen,
folgendes Beispiel:
tab_personen
-----------------
ID
NAME
VORNAME
LAND
tab_laender
-----------------
ID
LAND
In der Tabelle tab_personen wird als LAND die ID des Landes der Tabelle tab_laender als Fremdschlüssel abgespeichert.
Problem: Ich möchte in einer QCombobox alle Länder als Text aufgelistet haben. Im Hintergrund muss aber natürlich die ID mitgeführt werden, da diese dann beim Speichern in die Tabelle tab_personen geschrieben werden soll.
Kann mir jemand einen Tip geben wie ich sowas in Qt am besten anstelle?
Bin noch Anfänger und für jeden Tip dankbar!
Gruß, Andi
Fremdschlüssel in QCombobox
Fremdschlüssel in QCombobox
Zuletzt geändert von qtued am 26. Oktober 2016 19:05, insgesamt 2-mal geändert.
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: Fremdschlüssel in QCombobox
Ich würde einfach die Funktion
benutzen.
Code: Alles auswählen
void QComboBox::addItem(const QString & text, const QVariant & userData = QVariant())
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Re: Fremdschlüssel in QCombobox
Was Christian beschreibt, ist die einfachste Lösung. QComboBox bietet ein "abgespecktes" Interface wo man zu den "Display" Daten noch ein Satz User Daten (Variant) hinterlegen und anfragen kann.
Für Komplexere DInge ist die Combobox als View auf ein Model realisiert, was immer nur eine Zelle Anzeigt, und sich die Posi der Zelle ueber die Auswahl verschieben läßt.
Wenn man sich in die Model-View Architektur speziell von Qt einarbeitet, kann man damit auch komplexere Dinge loesen ... und vor allem schon vorhandene Models verwenden, die man an anderer STelle vielleicht eh schon braucht (Sql Models etc).
In nem Model kannst du z.b. zig verschiedene Sätze an Zusatzdaten hinter ner Zelle "verstecken" (siehe DataRole)
Ciao ...
Für Komplexere DInge ist die Combobox als View auf ein Model realisiert, was immer nur eine Zelle Anzeigt, und sich die Posi der Zelle ueber die Auswahl verschieben läßt.
Wenn man sich in die Model-View Architektur speziell von Qt einarbeitet, kann man damit auch komplexere Dinge loesen ... und vor allem schon vorhandene Models verwenden, die man an anderer STelle vielleicht eh schon braucht (Sql Models etc).
In nem Model kannst du z.b. zig verschiedene Sätze an Zusatzdaten hinter ner Zelle "verstecken" (siehe DataRole)
Ciao ...
Re: Fremdschlüssel in QCombobox
Vielen Dank für euere Antworten!
Für die Nachwelt: Ich habe mittlerweile einen Artikel gefunden, der eigentlich genau beschreibt, was ich gesucht habe:
QCombobox mit Werten aus der Datenbank in Forms
http://www.informit.com/articles/articl ... 0&seqNum=3
Auch in der Doku zum QSqlRelationalTableModel ist weiter unten ein sehr gutes Beispiel zu dem Thema. In dem gehts aber eher um die Darstellung in QTableViews/QListViews:
http://doc.qt.io/qt-4.8/qsqlrelationaltablemodel.html
Danke nochmal für die Hilfe - Thread hiermit geschlossen
Für die Nachwelt: Ich habe mittlerweile einen Artikel gefunden, der eigentlich genau beschreibt, was ich gesucht habe:
QCombobox mit Werten aus der Datenbank in Forms
http://www.informit.com/articles/articl ... 0&seqNum=3
Auch in der Doku zum QSqlRelationalTableModel ist weiter unten ein sehr gutes Beispiel zu dem Thema. In dem gehts aber eher um die Darstellung in QTableViews/QListViews:
http://doc.qt.io/qt-4.8/qsqlrelationaltablemodel.html
Danke nochmal für die Hilfe - Thread hiermit geschlossen
Re: Fremdschlüssel in QCombobox
Jetzt muss ich hier doch nochmal nachhaken: Eine Lösung per QDataWidgetMapper (wie in meinen Links beschrieben) hätte wohl funktioniert, ich hätte aber lieber eine Lösung ohne direktes Mapping mit der Datenbank.
Zum Programmstart hätte ich die Datenbank ausgelesen, für jede Zeile ein CPerson angelegt und mir das in einer QList<CPerson*> gemerkt. Zum Befüllen meiner QTableView wäre ich die QMap durchlaufen und hätte QStandartItem* erzeugt.
Ein Problem hab ich jetzt natürlich wieder beim Land, weil ich ja für meine QComboBox die ID und den String des Landes bräuchte.
Ist das denn generell ein unbrauchbarer Ansatz? Oder hab ich nur etwas übersehen? Wie würdet ihr das machen?
Vielen Dank schonmal!
Das ist mir soweit klar: Ich kann also in der QComboBox sowohl mein anzuzeigendes Land, also auch die ID abspeichern, die sich dahinter verbirgt. Aber jetzt hätte ich noch eine Frage zum Design: Mein Ansatz wäre eine Klasse CPerson gewesen, die vereinfacht dargestellt so aussieht:RHBaum hat geschrieben:Was Christian beschreibt, ist die einfachste Lösung. QComboBox bietet ein "abgespecktes" Interface wo man zu den "Display" Daten noch ein Satz User Daten (Variant) hinterlegen und anfragen kann.
Code: Alles auswählen
class CPerson
{
...
private:
QString name
QString vorname
int/QString land // PROBLEM: ID merken oder String?
}
Ein Problem hab ich jetzt natürlich wieder beim Land, weil ich ja für meine QComboBox die ID und den String des Landes bräuchte.
Ist das denn generell ein unbrauchbarer Ansatz? Oder hab ich nur etwas übersehen? Wie würdet ihr das machen?
Vielen Dank schonmal!