PDA

View Full Version : QTableView QTablemodel & insertRow



pfusterschmied
5th June 2007, 09:15
Hi,

I want to show Data from a Relational DB in a QTableView.
This work fine, also the editing about OnManualSubmit works. Now I want to add and delete Rows in the QTableView. When I tray to add a row an error occurs:

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

What does this error means?

I think its a memory lack but I don't know what to do?
I work on Ubuntu Feisty, QT 4.2.3, KDevelop 3.4




#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::SingleSelectio n);
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()
{
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!") );
}

void tableModel::deletePerson()
{

}



tableModel::~tableModel()
{

}


Person_Name = 1 (Column with persons name)

steg90
5th June 2007, 11:04
Could you not just do :



int row = model->rowCount();
QModelIndex index = model->index(row, Person_Name);
beginInsertRows(index, row, row );

// insert your data

endInsertRows();


Regards,
Steve

pfusterschmied
5th June 2007, 13:43
Found solution:



QTableView *viewTable = new QTableView;

doesn't work but:


viewTable = new QTableView;

because I defined this in header...:o

Thanks for the Code steg90 this is a good way too.