januszmk
13th July 2011, 11:54
Hello!
I have problem with QTableView and QStandardItemModel
My header file:
#ifndef TABLEVIEW_H
#define TABLEVIEW_H
#include <QtGui>
#include <QWidget>
#include <QTableView>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QString>
#include <QVector>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlError>
#include <QtSql/QSqlQuery>
#include <QtSql/QSQLiteDriver>
#include <QMessageBox>
#include <QDialog>
#include "dialog.h"
class tableView : public QWidget
{
Q_OBJECT
public:
tableView(QWidget *parent = 0);
void db_add(QString atr1, QString atr2);
QStandardItemModel *model;
private:
QString sstr;
QTableView *tblv;
QLabel *label1, *label2;
QLineEdit *lineeRow, *lineeCol;
QPushButton *btnApply;
int nrow, ncol;
QVector<QString> table;
int db_connect();
void btnApply_clicked();
QString asda;
QSqlDatabase db;
int a;
QStandardItem *item;
private slots:
void dial();
};
#endif // TABLEVIEW_H
source file:
#include "tableview.h"
#include <QDebug>
tableView::tableView(QWidget *parent)
: QWidget(parent)
{
//create layout
QVBoxLayout *mainLayout = new QVBoxLayout();
QHBoxLayout *horLayout1 = new QHBoxLayout;
QHBoxLayout *horLayout2 = new QHBoxLayout;
btnApply = new QPushButton(tr("Apply"));
//create QTableView
tblv = new QTableView();
tblv->setSelectionBehavior(QAbstractItemView::SelectItem s );
tblv->setSelectionMode( QAbstractItemView::ExtendedSelection );
//setting layout
mainLayout->addLayout(horLayout1);
mainLayout->addLayout(horLayout2);
mainLayout->addWidget(btnApply);
mainLayout->addWidget(tblv);
setLayout(mainLayout);
connect(btnApply, SIGNAL(clicked()), this, SLOT(dial()));
btnApply_clicked();
}
void tableView::dial()
{
Dialog dial;
dial.show();
dial.exec();
}
int tableView::db_connect()
{
if(!db.isOpen())
{
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./baza.db");
if (!db.open())
{
QMessageBox::critical(0, qApp->tr("Nie udało się nawiązać połączenia z bazą danych!"),
qApp->tr("Naciśnij Cancel aby zakończyć."), QMessageBox::Cancel);
}
return 1;
}
return 0;
}
void tableView::db_add(QString atr1, QString atr2)
{
QSqlQuery query;
QString asda;
asda = QString("insert into person values(null, '");
asda += atr1;
asda += "', '";
asda += atr2;
asda += "')";
qDebug() << asda;
query.exec(asda);
if(query.lastError().isValid())
qDebug() << query.lastError();
qDebug() << "1";
item = new QStandardItem(query.lastInsertId().toString());
qDebug() << "2";
model->setItem(a, 0, item);
qDebug() << "3";
item = new QStandardItem(atr1);
qDebug() << "4";
model->setItem(a, 1, item);
qDebug() << "5";
item = new QStandardItem(atr2);
qDebug() << "6";
model->setItem(a, 2, item);
}
void tableView::btnApply_clicked()
{
if(db_connect()==1)
{
//get number of input row and column
nrow = 2;
ncol = 3;
//create model
model = new QStandardItemModel( nrow, ncol, this );
//create QTableview Horizontal Header
// model->setHorizontalHeaderItem( r, new QStandardItem( QString("Column_ %0" ).arg(r+1)) );
model->setHorizontalHeaderItem(0, new QStandardItem(QString("Lp.")));
model->setHorizontalHeaderItem(1, new QStandardItem(QString("Nazwa")));
model->setHorizontalHeaderItem(2, new QStandardItem(QString("Haslo")));
QSqlQuery query;
a = 0;
query.exec("SELECT * from person");
while(query.next())
{
for(int x=0; x<3; x++)
{
sstr = query.value(x).toString();
item = new QStandardItem(sstr);
model->setItem(a, x, item);
}
a++;
}
//set model
tblv->setModel(model);
tblv->resizeRowsToContents();
tblv->setFixedSize(800,600);
tblv->setColumnWidth(2,350);
tblv->setColumnWidth(1,350);
tblv->setColumnWidth(0,50);
tblv->scrollToBottom();
}
}
in btnApply_Clicked() I am generating a table on base sqlite data.
in Dialog window I am giving arguments and calling up db_add function, then the arguments get into sqlite database and then I want to add this arguments to next rows in the QTableView, but when I run the program I get error of memory, and information in qt creator "exited with code -1073741819" when it get to item = new QStandardItem(query.lastInsertId().toString()). I tried give other argument (item = new QStandardItem(QString("test")) but it didn't help.
I would be grateful for your help, and sory for my bad english.
Janusz
I have problem with QTableView and QStandardItemModel
My header file:
#ifndef TABLEVIEW_H
#define TABLEVIEW_H
#include <QtGui>
#include <QWidget>
#include <QTableView>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QString>
#include <QVector>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlError>
#include <QtSql/QSqlQuery>
#include <QtSql/QSQLiteDriver>
#include <QMessageBox>
#include <QDialog>
#include "dialog.h"
class tableView : public QWidget
{
Q_OBJECT
public:
tableView(QWidget *parent = 0);
void db_add(QString atr1, QString atr2);
QStandardItemModel *model;
private:
QString sstr;
QTableView *tblv;
QLabel *label1, *label2;
QLineEdit *lineeRow, *lineeCol;
QPushButton *btnApply;
int nrow, ncol;
QVector<QString> table;
int db_connect();
void btnApply_clicked();
QString asda;
QSqlDatabase db;
int a;
QStandardItem *item;
private slots:
void dial();
};
#endif // TABLEVIEW_H
source file:
#include "tableview.h"
#include <QDebug>
tableView::tableView(QWidget *parent)
: QWidget(parent)
{
//create layout
QVBoxLayout *mainLayout = new QVBoxLayout();
QHBoxLayout *horLayout1 = new QHBoxLayout;
QHBoxLayout *horLayout2 = new QHBoxLayout;
btnApply = new QPushButton(tr("Apply"));
//create QTableView
tblv = new QTableView();
tblv->setSelectionBehavior(QAbstractItemView::SelectItem s );
tblv->setSelectionMode( QAbstractItemView::ExtendedSelection );
//setting layout
mainLayout->addLayout(horLayout1);
mainLayout->addLayout(horLayout2);
mainLayout->addWidget(btnApply);
mainLayout->addWidget(tblv);
setLayout(mainLayout);
connect(btnApply, SIGNAL(clicked()), this, SLOT(dial()));
btnApply_clicked();
}
void tableView::dial()
{
Dialog dial;
dial.show();
dial.exec();
}
int tableView::db_connect()
{
if(!db.isOpen())
{
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./baza.db");
if (!db.open())
{
QMessageBox::critical(0, qApp->tr("Nie udało się nawiązać połączenia z bazą danych!"),
qApp->tr("Naciśnij Cancel aby zakończyć."), QMessageBox::Cancel);
}
return 1;
}
return 0;
}
void tableView::db_add(QString atr1, QString atr2)
{
QSqlQuery query;
QString asda;
asda = QString("insert into person values(null, '");
asda += atr1;
asda += "', '";
asda += atr2;
asda += "')";
qDebug() << asda;
query.exec(asda);
if(query.lastError().isValid())
qDebug() << query.lastError();
qDebug() << "1";
item = new QStandardItem(query.lastInsertId().toString());
qDebug() << "2";
model->setItem(a, 0, item);
qDebug() << "3";
item = new QStandardItem(atr1);
qDebug() << "4";
model->setItem(a, 1, item);
qDebug() << "5";
item = new QStandardItem(atr2);
qDebug() << "6";
model->setItem(a, 2, item);
}
void tableView::btnApply_clicked()
{
if(db_connect()==1)
{
//get number of input row and column
nrow = 2;
ncol = 3;
//create model
model = new QStandardItemModel( nrow, ncol, this );
//create QTableview Horizontal Header
// model->setHorizontalHeaderItem( r, new QStandardItem( QString("Column_ %0" ).arg(r+1)) );
model->setHorizontalHeaderItem(0, new QStandardItem(QString("Lp.")));
model->setHorizontalHeaderItem(1, new QStandardItem(QString("Nazwa")));
model->setHorizontalHeaderItem(2, new QStandardItem(QString("Haslo")));
QSqlQuery query;
a = 0;
query.exec("SELECT * from person");
while(query.next())
{
for(int x=0; x<3; x++)
{
sstr = query.value(x).toString();
item = new QStandardItem(sstr);
model->setItem(a, x, item);
}
a++;
}
//set model
tblv->setModel(model);
tblv->resizeRowsToContents();
tblv->setFixedSize(800,600);
tblv->setColumnWidth(2,350);
tblv->setColumnWidth(1,350);
tblv->setColumnWidth(0,50);
tblv->scrollToBottom();
}
}
in btnApply_Clicked() I am generating a table on base sqlite data.
in Dialog window I am giving arguments and calling up db_add function, then the arguments get into sqlite database and then I want to add this arguments to next rows in the QTableView, but when I run the program I get error of memory, and information in qt creator "exited with code -1073741819" when it get to item = new QStandardItem(query.lastInsertId().toString()). I tried give other argument (item = new QStandardItem(QString("test")) but it didn't help.
I would be grateful for your help, and sory for my bad english.
Janusz