Seite 1 von 1

QSqlRelationalTableModel speichert nicht ab

Verfasst: 14. Juli 2010 12:49
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^^

Verfasst: 14. Juli 2010 14:29
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.

Verfasst: 15. Juli 2010 14:17
von Tanktiger
Ok ich beutzt QT 4.6 aber es geht immer noch nicht!

Woran kann das liegen?

Verfasst: 15. Juli 2010 14:27
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.

Verfasst: 21. Juli 2010 15:57
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

Verfasst: 21. Juli 2010 17:25
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 :)

Verfasst: 22. Juli 2010 13:04
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?:)

Verfasst: 31. Januar 2011 18:19
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

Verfasst: 16. Februar 2011 01:09
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