PDA

View Full Version : Problem with adding rows into QTableView



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

Santosh Reddy
13th July 2011, 14:29
You are missing this statment in the tableView ctor

model = new QStandardItemModel(this);

januszmk
13th July 2011, 15:11
but

model = new QStandardItemModel(this);
is initiated in function btnApply_clicked. If it is about changing (nrow, ncol, this) into (this) then i tried to do that and it didn't help. program is crashing when is in function db_add, and get to any of function in model.

Santosh Reddy
13th July 2011, 15:32
you might be calling db_add before btnApply_clicked

januszmk
13th July 2011, 20:10
btnApply_clicked is calling when program is starting, and db_add when i press the button, another window show then i press the button on that window:

void Dialog::on_pushButton_clicked()
{
text1 = ui->lineEdit->text();
text2 = ui->lineEdit_2->text();
if(!text1.isEmpty() && !text2.isEmpty())
{
tableView *table;
table->db_add(text1,text2);
}
this->close();
}

I just check, and if i am calling function db_add in btnApply_clicked() then its work ok, so maybe i got error in dialog class?

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QString>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
Q_OBJECT

public:
explicit Dialog(QWidget *parent = 0);
~Dialog();

private slots:

void on_pushButton_2_clicked();

void on_pushButton_clicked();

private:
Ui::Dialog *ui;
QString text1;
QString text2;
};

#endif // DIALOG_H


#include "dialog.h"
#include "ui_dialog.h"
#include "tableview.h"

Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}

Dialog::~Dialog()
{
delete ui;
}


void Dialog::on_pushButton_2_clicked()
{
this->close();
}

void Dialog::on_pushButton_clicked()
{
text1 = ui->lineEdit->text();
text2 = ui->lineEdit_2->text();
if(!text1.isEmpty() && !text2.isEmpty())
{
tableView *table;
table->db_add(text1,text2);
}
this->close();
}

i get in "Build Issues" "table may be used uninitialized in this function

januszmk
14th July 2011, 08:14
I maybe found solution, but don't know how to do it. Could someone tell me, how can I connect to signal clicked() on button from ui from other class? because even if I declare ui as public, i can't get to that button from tableView class:

Dialog dialog = new Dialog();
dialog->show();
dialog->exec();
connect(dialog->ui->pushButton, SIGNAL(clicked()),this,on_pushButton_clicked()); // <- there i have error

stampede
14th July 2011, 08:22
Look like you forgot the SLOT keyword:


connect(dialog->ui->pushButton, SIGNAL(clicked()),this,SLOT(on_pushButton_clicked( )));

Santosh Reddy
14th July 2011, 08:31
Dialog dialog = new Dialog();
dialog->show();
connect(dialog->ui->pushButton, SIGNAL(clicked()),this,SLOT(on_pushButton_clicked( ))); //you missed SLOT keyword, and also you should connect before calling exec()
dialog->exec();

januszmk
14th July 2011, 09:20
Thank you very much, now everything is working.