QSqlTlabeModel über QComboBox: Aktualisierung der Anzeige

Alles rund um die Programmierung mit Qt
Antworten
harry_m
Beiträge: 74
Registriert: 26. April 2010 23:16

QSqlTlabeModel über QComboBox: Aktualisierung der Anzeige

Beitrag von harry_m »

Es wird in einem Forumular über ein QSqlTableModel auf eine SQLite3 Datenbank zugegriffen:

Code: Alles auswählen

    tabModel = new QSqlTlabeModel(this);
    tabModel->setTable("tabExpenses");
    tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
    tabModel->select();

    ui.setupUi(this);
    ui.comboBox_Country->setFocus();
    ui.comboBox_Country->setModel(tabModel);
    ui.comboBox_Country->setModelColumn(tabModel->fieldIndex("country"));
Die Combobox dient sowohl zur Anzeige und Auswahl des Landes ("country") als auch für die Eingabe eines neuen Datensatzes.

Code: Alles auswählen

// Slot "Add New Country":
void FormExpenses::addNewCountry()
{
    int row = tabModel->rowCount();
    tabModel->insertRows(row, 1);
    tabModel->setData(tabModel->index(row, 0), row +1);
    tabModel->submit();
    mapper->setCurrentIndex(row);
    ui.comboBox_Country->setFocus();
    reqNewCountry = TRUE;
}

// Slot "Submit Expenses data":
void FormExpenses::submitExpenses()
{
    tabModel->submitAll();
    tabModel->select();
    reqNewCountry = FALSE;
    ui.comboBox_Country->update();
}
Und hier entsteht das Problem: nachdem der neue Datensatz angelegt und gespeichert ist, wird in der Combobox die neue Landbezeichnung nicht angezeigt.

(Z.B.: es gibt nur zwei Länder: "Deutschland" und "USA". Ich füge ein drittes Land hinzu ("UK"): in der Combobox ist aber "Deutschland", "USA" und wieder "Deutchland" zu sehen...)

Und das obwohl in der Datenbank der richtige Wert steht: den sieht man auch, wenn das Forumular geschlossen und wieder geöffnet wird.

Was zum Geier mache ich falsch?

Gruß
Harry
Zwei Tragödien gibt es im Leben: die eine - nicht zu bekommen, was das Herz wünscht, und die andere: es doch zu bekommen. (Oscar Wilde)
harry_m
Beiträge: 74
Registriert: 26. April 2010 23:16

Re: QSqlTlabeModel über QComboBox: Aktualisierung der Anzeig

Beitrag von harry_m »

Ich glaube es einfach nicht...

Das ist die Lösung:

Code: Alles auswählen

// Slot "Submit Expenses data":
void FormExpenses::submitExpenses()
{
    tabModel->submitAll();
    reqNewCountry = FALSE;
    tabModel->select();
    ui.comboBox_Country->update();
}
Scheint ein Laufzeit Problem zu sein: das gefällt mir überhaupt nicht...
Zwei Tragödien gibt es im Leben: die eine - nicht zu bekommen, was das Herz wünscht, und die andere: es doch zu bekommen. (Oscar Wilde)
harry_m
Beiträge: 74
Registriert: 26. April 2010 23:16

Re: QSqlTlabeModel über QComboBox: Aktualisierung der Anzeig

Beitrag von harry_m »

Mir scheint, ich habe die "Lösung" bzw. daraus entstandene Problem nicht ausreichend beschrieben.

Das ist der Code der Methode, mit dem das Problem reproduziert werden kann:

Code: Alles auswählen

// Slot "Submit Expenses data":
void FormExpenses::submitExpenses()
{
    tabModel->submitAll();
    tabModel->select();
    reqNewCountry = FALSE;
    ui.comboBox_Country->update();
}
Und das ist der Code der Methode, mit der das Problem nicht mehr auftritt:

Code: Alles auswählen

// Slot "Submit Expenses data":
void FormExpenses::submitExpenses()
{
    tabModel->submitAll();
    reqNewCountry = FALSE;
    tabModel->select();
    ui.comboBox_Country->update();
}
Man beachte: es wurde nur die Kodezeile

Code: Alles auswählen

reqNewCountry = FALSE
um eine Zeile nach oben verschoben. Somit befindet sich diese jetzt zwischen

"tabModel->submitAll();"
und
"tabModel->select()".

Es sieht so aus, dass im ersten Fall die "submitAll()"-Methode nicht fertig wird und "select()" mit "unfertigen" Daten falsches Ergebnis liefert.

In diesem Fall läuft es unter Windows und mit SQLite als Datenbank. Ich bin ziemlich skeptisch, ob es mit einer anderen Datenbank oder mit einem anderen Betriebssystem nicht doch wieder Probleme macht. Mir ist bis jetzt nicht eingefallen, was ich an dieser Stelle hätte machen können. Es ist ja auch alles andere als eine "saubere" Lösung.

Wie kann ich sicher stellen, dass die "select()"-Methode erst ausgeführt wird, wenn "submitAll()" TATSACHLICH fertig ist?
Zwei Tragödien gibt es im Leben: die eine - nicht zu bekommen, was das Herz wünscht, und die andere: es doch zu bekommen. (Oscar Wilde)
Antworten