QTableView, QSqlRelationalTableModel und insertRow

Alles rund um die Programmierung mit Qt
Antworten
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

QTableView, QSqlRelationalTableModel und insertRow

Beitrag von pfusterschmied »

Hallo,

Ich zeige in einer QTableView Daten aus einer Relationalen DB an.
Dies funktioniert soweit. Auch das editieren über OnManualSubmit funktioniert. Nun möchte ich auch gerne neue Datensätze anlegen bzw. löschen. Hab schon alle Möglichkeiten welche ich in Büchern bzw. Online gefunden habe ausprobiert. Leider kommt es zu einer Fehlermeldung sobald ich irgendwie auf viewTable (QTableView) zugreifen will:

Segmentation fault (core dumped)
*** Exited with status: 139 ***

Kann mir jemand sagen was dieser Fehler bedeutet, bzw. was ich übersehe.

Ich vermute es ist ein Speicherproblem weil ich die QTableView auf dem Heap erzeuge???

Code: Alles auswählen

#include <QtGui>
#include <QtSql>
#include <QDebug>
#include "tablemodel.h"

tableModel::tableModel()
{

	QPushButton *submitPb = new QPushButton(QObject::trUtf8("Änderungen speichern"));
	QPushButton *revertPb = new QPushButton(QObject::trUtf8("Änderungen verwerfen"));
	QPushButton *addPb = new QPushButton(QObject::trUtf8("Neue Person"));
	QPushButton *deletePb = new QPushButton(QObject::trUtf8("Lösche Person"));
	
	QSqlRelationalTableModel *model = new QSqlRelationalTableModel(this);
	model->setTable("tx_submission_data");
	model->setRelation(28,QSqlRelation("tx_submission_epterm","uid", "epterm"));
	model->setRelation(29,QSqlRelation("tx_submission_status","uid", "status"));
	model->setRelation(30,QSqlRelation("tx_submission_status","uid", "status"));
	model->setRelation(31,QSqlRelation("tx_submission_status","uid", "status"));
	model->setRelation(32,QSqlRelation("tx_submission_status","uid", "status"));
	model->setRelation(33,QSqlRelation("tx_submission_status","uid", "status")); 
	model->setRelation(34,QSqlRelation("tx_submission_status","uid", "status"));
	model->setEditStrategy(QSqlTableModel::OnManualSubmit);


	model->removeColumns(1,7);
	model->removeColumn(5);
	model->removeColumn(6);
	model->removeColumn(6);
	model->removeColumn(6);
	model->removeColumn(7);
	model->removeColumn(7);
	model->removeColumn(7);
	model->removeColumn(7);
	model->removeColumn(7);
	model->removeColumn(7);
	model->removeColumn(7);
	model->removeColumn(8);
	model->removeColumn(11);

	model->select();

	QTableView *viewTable = new QTableView;
	viewTable->setModel(model);
	viewTable->setItemDelegate(new QSqlRelationalDelegate(this));
	viewTable->setSortingEnabled(TRUE);
	viewTable->setAlternatingRowColors(TRUE);
	//viewTable->hideColumn(0);	
	viewTable->setSelectionMode(QAbstractItemView::SingleSelection);
	viewTable->setSelectionBehavior(QAbstractItemView::SelectRows);
	viewTable->resizeColumnsToContents();

	connect(submitPb, SIGNAL(clicked(bool)), model, SLOT(submitAll()) );
	connect(revertPb, SIGNAL(clicked(bool)), model, SLOT(revertAll() ) );
	
	connect(addPb, SIGNAL(clicked(bool)), this, SLOT(addPerson() ) );
	connect(deletePb, SIGNAL(clicked(bool)), this, SLOT(deletePerson() ) );

	QGridLayout *lay = new QGridLayout(this);
	lay->addWidget(viewTable, 0, 0, 1, 4);
	lay->addWidget(submitPb, 1, 0);
	lay->addWidget(revertPb, 1, 1);
	lay->addWidget(addPb, 1, 2);
	lay->addWidget(deletePb, 1, 3);

	// CSS
	qApp->setStyleSheet("QTableView {background-color: #eeeeee; background-image: url(:/bg.png); color: blue;}");
}

void tableModel::addPerson()
{
	QModelIndexList indexes = viewTable->selectionModel()->selection().indexes();
        for (int i = 0; i < indexes.count(); ++i)
        {    
               
            QModelIndex index = indexes.at(i);
            QMessageBox::information(this,"", QString::number(i));
            
         } 
	
	QMessageBox::warning(this, trUtf8("Person hinzufügen"), trUtf8("Sie müssen alle Felder ausfüllen!") );
}

void tableModel::deletePerson()
{
	
}



tableModel::~tableModel()
{

}


pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag von pfusterschmied »

geht auch nicht ...
sobald ich viewTable erwähne kommt der Speicherfehler...

Code: Alles auswählen

void tableModel::addPerson()
{
	
	int row = model->rowCount();
	model->insertRow(row);
	QModelIndex index = model->index(row, Person_Name);
	viewTable->setCurrentIndex(index);
	viewTable->edit(index);
	
	QMessageBox::warning(this, trUtf8("Person hinzufügen"), trUtf8("Sie müssen alle Felder ausfüllen!") );
}
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

Fehler gefunden

Beitrag von pfusterschmied »

Hab den Fehler gefunden ...
Der Aufruf für insertRow() war in Ordnung nur hatte ich im Header File
bereits viewTable definiert. :oops:

somit funktioniert dies nicht:

Code: Alles auswählen

 QTableView *viewTable = new QTableView; 
und das klappt:

Code: Alles auswählen

viewTable = new QTableView; 
Antworten