Seite 1 von 1

QSqlTableModel führt Insert nach insertRow nicht aus

Verfasst: 5. Februar 2009 14:13
von Strayer
Hallo,

ich bin gerade dabei ein kleines Programm zu schreiben welches diverse tableViews und QSqlTableModels verwendet.
Leider bekomme ich es nicht hin eine neue Zeile hinzuzufügen.

Ich hab das Problem in einem simplen Dialog nachgebaut (siehe Anhang)

Zum reproduzieren:
1. "New entry" klicken
2. Eingaben machen
3. Zu Tabelle 2 wechseln
4. Wieder zu Tabelle 1 wechseln
-> Zeile verschwunden

Hier der relevante Code:

Code: Alles auswählen

#include <QtSql>
#include <QHeaderView>
#include <QModelIndex>

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent), ui(new Ui::DialogClass)
{
    ui->setupUi(this);

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");

    if (!db.open())
        qDebug("could not open db");

    QSqlQuery query;
    query.exec("CREATE TABLE table1 (id INTEGER PRIMARY KEY, text CHAR)");
    query.exec("CREATE TABLE table2 (id INTEGER PRIMARY KEY, text CHAR)");
    query.exec("INSERT INTO table1 values(1, 'Hello world in table 1!')");
    query.exec("INSERT INTO table2 values(1, 'Hello world in table 2!')");

    model = new QSqlTableModel(this);
    model->setTable("table1");
    model->select();

    ui->tableView->setModel(model);
    ui->tableView->horizontalHeader()->setStretchLastSection(true);
}

Dialog::~Dialog()
{
    delete model;
    delete ui;
}

void Dialog::on_table1Button_toggled(bool toggle)
{
    ui->table2Button->setChecked(!toggle);
    model->setTable("table1");
    model->select();
}

void Dialog::on_table2Button_toggled(bool toggle)
{
    ui->table1Button->setChecked(!toggle);
    model->setTable("table2");
    model->select();
}

void Dialog::on_addEntryButton_clicked()
{
    int row = model->rowCount();
    model->insertRow(row);

    QModelIndex index = model->index(row, 0);
    ui->tableView->edit(index);
}

Verfasst: 5. Februar 2009 16:21
von franzf
Also, wenn ich einen neuen EIntrag erstell, dann auf [Enter] drück (->submit) und lurz die Tabellen wechsel ist das trotzdem noch drinnen...
Hingegen wenn ich ohne [enter] die table wechsel (also während der Cursor noch blinkt) ist die auch futsch...

Du kannst das in deinem Programm z.B. so lösen, dass du einen Dialog zum Eintragen der Daten erstellst. Bei einem [ok] werden zuerst die Daten geprüft, und dann ins Model geschrieben. (oder eben direkt in die Datenbank via insert).

Verfasst: 5. Februar 2009 17:21
von Strayer
Tatsache, man muss Enter drücken, dann klappt es! ...dass ich darauf nicht gekommen bin, danke! ;)

Hmm, dann werde ich wohl mal die Dialog-Lösung ausprobieren. Fand es so eigentlich ganz schön, da man den Bildschirm nicht verlässt, aber das geht wohl nicht so einfach.

Edit:
Jetzt bemerke ich überhaupt erst noch ein Problem...
Wenn ich ein Feld bearbeite und nicht mit Enter bestätige wird die Änderung auch nicht ausgeführt...
Das ist ziemlich unpraktisch, da das View aktualisiert wird, das Model aber offenbar nichts davon mitbekommt. Muss ich da irgendeine Option anschalten?