QSqlRelationalTableModel speichert nicht ab

Alles rund um die Programmierung mit Qt
Antworten
Tanktiger
Beiträge: 21
Registriert: 4. März 2010 10:51
Kontaktdaten:

QSqlRelationalTableModel speichert nicht ab

Beitrag von Tanktiger »

Moin

Hab ein Problem mit meinem QSqlRelationalTableModel. Und zwar wenn ich die Werte editieren will dann werden die nicht geändert. Kann mir da wer helfen?
Mein Quellcode bis jetzt:

Code: Alles auswählen

model = new QSqlRelationalTableModel();

     model->setTable( "RelQuestAnswer" );
     model->setEditStrategy(QSqlTableModel::OnManualSubmit);
     //model->setEditStrategy(QSqlTableModel::OnRowChange);
     model->setRelation( 1, QSqlRelation( "Questions", "f_id", "Questions" ) );
     model->setRelation( 2, QSqlRelation( "Answers", "a_id", "Answers" ) );
     model->select();

     model->setHeaderData( 0, Qt::Horizontal, QObject::tr("RFA_ID") );
     model->setHeaderData( 1, Qt::Horizontal, QObject::tr("Fragen") );
     model->setHeaderData( 2, Qt::Horizontal, QObject::tr("Antworten") );
     model->setHeaderData( 3, Qt::Horizontal, QObject::tr("Richtig (1=richtig)") );

    qDebug() << "submitAll" << model->submitAll();
    qDebug() << " -->" << model->lastError();

     view = new QTableView();
     view->setModel( model );
     view->setGeometry(500,100,450,500);
     view->setColumnHidden(0,true);
     view->show();
wie ihr seht hab ich es schon mit ner anderen EditStrategy versucht. Geht ebenfalls nicht.

Beim QDebug steht folgendes:

Code: Alles auswählen

submitAll true 
 --> QSqlError(-1, "", "") 
Bin dankbar für jede Hilfe^^
Tanktiger
Beiträge: 21
Registriert: 4. März 2010 10:51
Kontaktdaten:

Beitrag von Tanktiger »

Ok das hat sich erledigt. Mit QT Version 4.5.2 geht das nicht mit dem Comfort von QSqlRelationalTableModel.
Erst mit Version 4.6 kann ich das benutzen.
Tanktiger
Beiträge: 21
Registriert: 4. März 2010 10:51
Kontaktdaten:

Beitrag von Tanktiger »

Ok ich beutzt QT 4.6 aber es geht immer noch nicht!

Woran kann das liegen?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Wenn du OnManualSubmit setzt, musst du NACH dem Editieren submitAll/revertAll aufrufen (->Doku). Du rufst das zu einem Zeitpunkt auf, wo noch gar kein View existiert!
Entweder bastelst du einen Button drunter, auf den man drücken muss, der dann wiederum auf submitAll() connected ist, oder du bleibst beim Default: QSqlTableModel::OnFieldChange.
Tanktiger
Beiträge: 21
Registriert: 4. März 2010 10:51
Kontaktdaten:

Beitrag von Tanktiger »

Hey dank dir
habs probiert mit OnFieldChange. Das Funktionierte soweit nicht.
Habs jetzt mal mit dem zusätzlichen Button probiert. Bloß immer wenn ich jetzt im Programm auf den Button drück, damit er mir mein widget aufruft, stürzt das Programm ab.
Der Code:

Code: Alles auswählen

    model = new QSqlRelationalTableModel();

    model->setTable( "RelQuestAnswer" );
    model->setEditStrategy(QSqlRelationalTableModel::OnManualSubmit);
    model->setRelation( 1, QSqlRelation( "Questions", "f_id", "Questions" ) );
    model->setRelation( 2, QSqlRelation( "Answers", "a_id", "Answers" ) );
    model->select();

    model->setHeaderData( 0, Qt::Horizontal, QObject::tr("RFA_ID") );
    model->setHeaderData( 1, Qt::Horizontal, QObject::tr("Fragen") );
    model->setHeaderData( 2, Qt::Horizontal, QObject::tr("Antworten") );
    model->setHeaderData( 3, Qt::Horizontal, QObject::tr("Richtig (1=richtig)") );

    view = new QTableView();
    view->setModel( model );
    view->setColumnHidden(0,true);

    qpbFsave=new QPushButton("Speichern",this);
    connect(qpbFsave, SIGNAL(clicked()), wfedit, SLOT(submitAll()));
    qclose=new QPushButton("Rückgängig", this);
    connect(qclose, SIGNAL(clicked()), wfedit, SLOT(revertAll()));

    qglFedit= new QGridLayout();
    qglFedit->addWidget(view,0,0,1,2);
    qglFedit->addWidget(qpbFsave,1,0);
    qglFedit->addWidget(qclose,1,1);
    wfedit = new QWidget();
    wfedit->setLayout(qglFedit);
    this->setCentralWidget(wfedit);
Bin Dankbar für jede Hilfe
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Tanktiger hat geschrieben:Bloß immer wenn ich jetzt im Programm auf den Button drück, damit er mir mein widget aufruft, stürzt das Programm ab.
Und wo erstellst du den Button zum "Aufrufen deines Widgets"? Und wo ist der Code, der das Widget zusammenbaut?
Ich seh nämlich nur Connections in Richtung submitAll/revertAll, und das sind keine Widgets, die aufgerufen werden.

Und Programmabstürze kann man wunderbar mit dem Debugger beheben :)
Tanktiger
Beiträge: 21
Registriert: 4. März 2010 10:51
Kontaktdaten:

Beitrag von Tanktiger »

Der Button wird im konstruktor 200 Zeilen höher definiert. Er ist auch richtig verlinkt etc. Hab alles mehrmals nachgeprüft und nachprüfen lassen.

Das gibt der Debugger aus:
Der Prozess wurde nach Erhalt eines Signals vom Betriebssystem angehalten.

Name des Signals: SIGSEGV
Bedeutung: Segmentation Fault
Leider was ich damit nicht viel anzufangen ausser das er nicht in Arbeitsspeicher schreiben kann.

Weiß wer rat?

EDIT:
Hab das Prob wohl gefunden. War die zu genaue angabe in QGridlayout.

Zumindestens weiß ich jetzt aber das er es nicht abspeichert! Mein submitAll() liegt auf nem Button aber er speicherts nicht. Zudem wenn ich etwas in der QSqlRelationalTableModel etwas ändern will dann übernimmt er es nicht. Damit mein ich, wenn ich das Programm aufruf und meine Tabelle mir dann ausgeben lass, dann kann ich darin zwar umherschreiben aber er ändert nix.

Hilfe?:)
Mensch
Beiträge: 50
Registriert: 16. März 2008 19:44

Beitrag von Mensch »

Hi,

wurde das Problem mittlerweile gelöst? Ich hab das selbe Problem, nur dass es bei mir ein "normales" QSqlTableModel Die EditStrategy steht auf OnFieldChange. Laut Doku (4.6, nutze ich auch) sollte das "einfach so" gehen. Ich wollte eigentlich keine Spezialisierung machen und setData() etc reimplementieren. Hat einer eine Ahnung was man da so alles falsch machen kann? Die Daten werden alle angezeigt, lassen sich editieren, werden aber nicht gespeichert.

Code: Alles auswählen

tModelC = new QSqlTableModel;
tModelC->setTable("c");
tModelC->setEditStrategy(QSqlTableModel::OnFieldChange);
tModelC->select();

ui->tableView_c->setModel(mysqlhandler->getTableModelC());
Danke und Grüße
its_hausi
Beiträge: 2
Registriert: 9. Februar 2011 22:34

Beitrag von its_hausi »

Der Qt Code scheint soweit richtig, seit ihr euch denn sicher,
dass ihr für die SQL Tabelle auch Schreibrechte und nicht nur Lesezugriff habt?

Ich benutze diesen Code mit Erfolg:

Code: Alles auswählen

QSqlTableModel* LiquidDB::getTableModel(QString table)
{
   QSqlTableModel *model = new QSqlTableModel;
   model->setTable(table);
   model->select();
   model->setEditStrategy(QSqlTableModel::OnFieldChange);
   return model;
}
ui->tableBargeld->setModel(db.getTableModel("Bargeld"));
Der einzige Unterschied scheint mir zu sein, dass ich das

Code: Alles auswählen

 select() 
vor dem

Code: Alles auswählen

setEditStrategy()
verwendet habe. Vllt liegt es ja daran (kann ich mir eigentlich nicht vorstellen). Gruß its_hausi
Es gibt keine Frage, die nicht schließlich auf Zahlen reduzierbar ist. - Auguste Comte
Antworten