PDA

View Full Version : Simple Widget Mapper Example with Qtableview+QSqlTableModel?!



fatecasino
28th February 2011, 16:04
hi,

I have understood the "Simple Widget Mapper Example (http://doc.trolltech.com/latest/itemviews-simplewidgetmapper.html)" and I try to implement it with a basic change:

Do you have any idea how to get the database viewed in a QtableView instead of Qlineedits?

This is what I have got so far:

#include <QtSql/QSqlTableModel>
#include <QtSql/QSqlRelationalDelegate>
#include <QtSql/QSqlRecord>

#include <QPushButton>

MyDialog::MyDialog(int id, QWidget *parent)
: QDialog(parent)
{
flatComboBox = new QComboBox();
// ageSpinBox->setMaxCount(3);
// ageSpinBox->addItem("a");
// ageSpinBox->addItem("b");
// ageSpinBox->addItem("c");

nameEdit = new QLineEdit();
addressEdit = new QTextEdit();

//set up the model
tableModel = new QSqlTableModel(this);
tableModel->setEditStrategy(QSqlTableModel::OnFieldChange);
tableModel->setTable("lista");
tableModel->select();
tableModel->setHeaderData(0, Qt::Horizontal, tr("name"));
tableModel->setHeaderData(1, Qt::Horizontal, tr("address"));
tableModel->setHeaderData(2, Qt::Horizontal, tr("flat"));

//mapper
mapper = new QDataWidgetMapper(this);
mapper->setModel(tableModel);
mapper->addMapping(nameEdit, 0);
mapper->addMapping(addressEdit, 1);
mapper->addMapping(flatComboBox, 2);
mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
mapper->toFirst();


//set up the view
myTableView = new QTableView(this);
myTableView->setModel(tableModel);
myTableView->resizeColumnsToContents();
myTableView->setWindowTitle("pame reeee");

//a second view just to check if the database is updated
QTableView *view2 = new QTableView(this);
view2->setModel(tableModel);
view2->setWindowTitle("Table Model (View 2)");
view2->resizeColumnsToContents();
//creating the first sql entry
createConnection();

//just to print out some results
QLineEdit* le = new QLineEdit(this);

//add new row
QPushButton *newRowBtn = new QPushButton;
newRowBtn->setText("add new row");
connect(newRowBtn,SIGNAL(clicked()),this,SLOT(addN ewRow()));

vboxlayout = new QVBoxLayout(this);
vboxlayout->addWidget(myTableView);
vboxlayout->addWidget(view2);
vboxlayout->addWidget(new QLabel("print info..."));
vboxlayout->addWidget(le);
vboxlayout->addWidget(newRowBtn);
setLayout(vboxlayout);
}

MyDialog::~MyDialog()
{
}
bool MyDialog::createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open()) {
QMessageBox::critical(0, qApp->tr("Cannot open database"),
qApp->tr("Unable to establish a database connection.\n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information how "
"to build it.\n\n"
"Click Cancel to exit."), QMessageBox::Cancel);
return false;
}
QSqlQuery query;
query.exec("create table lista (name varchar(20) primary key, "
"address varchar(20), flat int)");
query.exec("insert into lista values( 'john smith', '13,oxford str',3)");
return true;
}
void MyDialog::addNewRow()
{
QModelIndex index;
int row = tableModel->rowCount();
tableModel->insertRow(row);
index = tableModel->index(row, 0);
myTableView->setCurrentIndex(index);
myTableView->edit(index);
}

norobro
28th February 2011, 19:54
Try moving createConnection() to the top of your constructor.