Fremdschlüssel in QCombobox

Alles rund um die Programmierung mit Qt
Antworten
qtued
Beiträge: 10
Registriert: 24. Juni 2014 13:06

Fremdschlüssel in QCombobox

Beitrag von qtued »

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.

:arrow: 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? :roll:

Bin noch Anfänger und für jeden Tip dankbar!

Gruß, Andi
Zuletzt geändert von qtued am 26. Oktober 2016 19:05, insgesamt 2-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Fremdschlüssel in QCombobox

Beitrag von Christian81 »

Ich würde einfach die Funktion

Code: Alles auswählen

void QComboBox::addItem(const QString & text, const QVariant & userData = QVariant())
benutzen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Fremdschlüssel in QCombobox

Beitrag von RHBaum »

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 ...
qtued
Beiträge: 10
Registriert: 24. Juni 2014 13:06

Re: Fremdschlüssel in QCombobox

Beitrag von qtued »

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 :-)
qtued
Beiträge: 10
Registriert: 24. Juni 2014 13:06

Re: Fremdschlüssel in QCombobox

Beitrag von qtued »

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.
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.
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:

Code: Alles auswählen

class CPerson
{
...

private:
QString name
QString vorname
int/QString land // PROBLEM: ID merken oder String?
}
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!
Antworten