Solved Choosing columns for display in an QSqlTableModel
-
@VRonin
Thank you. I have the following:QStandardItemModel *smodel = new QStandardItemModel; row1 = 0; for(;query.next (); row1++) { smodel->setData (smodel->index(row1,0), NameD = query.value(0).toString ()); qDebug() << "row1: " << row1; qDebug() << "NameD: " << NameD; Pixmap.loadFromData (query.value (1).toByteArray ()); smodel->setData (smodel->index(row1,1),Pixmap,Qt::DecorationRole ); smodel->setData (smodel->index(row1,2), DescrD = query.value (2).toString ()); qDebug() << "DescrD: " << DescrD; } ui->tableView->show ();
qDebug() shows that the variables have the right values, but nothing shows in the table. What did I miss?
-
Hi
Maybe
smodel->setData (xx for DescrD needs Qt::DisplayRole
like u do for Qt::DecorationRole ? -
@mrjj
Unfortunatelysmodel->setData (smodel->index(row1,0), NameD = query.value(0).toString (),Qt::DisplayRole);
did nothing. The table is still empty.
-
@gabor53
and u are 100000% sure that it adds NameD ?
and its not empty? -
the code you posted is missing the necessary
smodel->insertRows()
smodel->inserColumns()
are you doing it? -
@VRonin
Hi
I don't have it. Whete is this supposed to go?
Thank you -
Hi,
Why not just use a QSqlQueryModel and a QStyledItemDelegate ?
If you want to have specific names for the columns you are selecting then use the
SELECT myColumn AS NewName
construct. -
QStandardItemModel *smodel = new QStandardItemModel(this); // maybe give it a parent to avoid memory leaks for(int row1=0;query.next (); ++row1) { if(row1==0){ const QSqlRecord qRec=query.record(); smodel->insertColumns(0,qRec.count()); Q_ASSERT(query.size()>=0) // if NO COUNT is set in the database then you have to calculate the size manually smodel->inserRows(0,query.size()); // Optional: set headers for(int i=0;i<qRec.count();++i) smodel->setHeaderData(i,Qt::Horizontal,qRec.fieldName(i)); } smodel->setData (smodel->index(row1,0), NameD = query.value(0).toString ()); qDebug() << "row1: " << row1; qDebug() << "NameD: " << NameD; Pixmap.loadFromData (query.value (1).toByteArray ()); smodel->setData (smodel->index(row1,1),Pixmap,Qt::DecorationRole ); smodel->setData (smodel->index(row1,2), DescrD = query.value (2).toString ()); qDebug() << "DescrD: " << DescrD; }
-
@VRonin
Thank you very much for the code. Now it shows the column headers, but still no data.
I addedui->tableView->setModel (smodel);
to view it in tableView.Any Idea why no records show?
Thank you. -
Looks like rows are still mot inserted, try this:
for(int row1=0;query.next (); ++row1) { if(row1==0){ const QSqlRecord qRec=query.record(); smodel->insertColumns(0,qRec.count()); // Optional: set headers for(int i=0;i<qRec.count();++i) smodel->setHeaderData(i,Qt::Horizontal,qRec.fieldName(i)); } smodel->inserRow(row1); smodel->setData (smodel->index(row1,0), query.value(0).toString ()); Pixmap.loadFromData (query.value (1).toByteArray ()); smodel->setData (smodel->index(row1,1),Pixmap,Qt::DecorationRole ); smodel->setData (smodel->index(row1,2), query.value (2).toString ()); }
-
@VRonin
Thank you. This one displays data from the database but only one record (1 line). Trying to figure out why. -
Any idea why this code displays only 1 record from the database?
-
Check your query and your database content.
-
@SGaist Thank you. I was missing a }.