Data not displaying on the QTreeView, QTableView,QListView classes
-
Addressbookmodel model(addresses); QTreeView treeView; QTableView tableView;
Exactly as @VRonin says: all three of these need to be allocated on the heap (
new ...
) for them to persist once the code you show in yourWidget
constructor has exited.Or, you might get away with making them members (without(As per @VRonin below, just don't try that way, stick tonew
) of yourWidget
class itself, if that lifetime is sufficient.new
!) -
@VRonin
That's why I said "might get away with". I know how fond you C++ people here are about using the stack instead of the heap if at all possible (whereas I am Python/PyQt and so just use the heap the whole time :) ), so I put that in in case someone complained, I did wonder about it. I'll just cross it through!@JonB , @VRonin I want to learn model/view architecture, so I picked up the Book Qt 4 art of building to study and practice, went to 207 page for basic understanding and page 222 example I want to study and implement,
- They have told to store the
.csv
file format like this :
’’title (column 1)’’, ’’title (column 2)’’, ...,’’title (column n)’’
’’value’’, ’’value’’, ..., ’’value’’
’’value’’, ’’value’’, ..., ’’value’’
’’value’’, ’’value’’, ..., ’’value’’
if I store like this and doqDebug()
on theQList
object, which has all the values of lines, it is giving output "" "" so, I did change the format and stored like this with values :
csv file:
'Name', 'Address'
'thippu', 'talacaverlayout'
after this change,qDebug()
did show file data. - output and Ui
2)Not understanding why the data is not displaying on the Views.
code AddressbookGui:
//csv file read method. QStringList splitCSVLine(const QString& line) { bool inItem = false; QStringList items; QString item; for (int pos = 0; pos < line.length(); pos++) { QChar c=line.at(pos); if ( c == ’\’’) { if (inItem) { items.append(item); item = ""; } inItem = !inItem; } else if (inItem) { item += c; } } return items; } //constructor AddressbookModel::AddressbookModel(const QString& addresses, QObject *parent): QAbstractTableModel(parent) { QStringList records = addresses.split(’\n’); QStringList line; foreach(QString record, records) addressBook.append(splitCSVLine(record)); } int AddressbookModel::rowCount(const QModelIndex &parent ) const { Q_UNUSED(parent); return addressBook.count() - 2; } //rowCount method int AddressbookModel::columnCount(const QModelIndex &parent ) const { Q_UNUSED(parent); return addressBook.at(0).count(); } //headerData method QVariant AddressbookModel::headerData(int section,Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal) { if (role == Qt::DisplayRole) { return addressBook.at(0).at(section); } } return QAbstractTableModel::headerData(section, orientation, role); } //data method QVariant AddressbookModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); QStringList addressRecord = addressBook.at(index.row()+1); if (role == Qt::DisplayRole || role == Qt::EditRole) { return addressRecord.at(index.column()); } if (role == Qt::ToolTipRole) { QString tip, key, value; tip = "<table>"; int maxLines = addressRecord.count(); for (int i = 0; i < maxLines; i++) { key = headerData(i, Qt::Horizontal, Qt::DisplayRole) .toString(); value = addressRecord.at(i); if (!value.isEmpty()) tip += QString("<tr><td><b>%1</b>: %2</td></tr>") .arg(key, value); } tip += "</table>"; return tip; } return QVariant(); }
- They have told to store the
-
- pass your model through the Model Test
- make sure it survives and doesn't go out of scope as your views did
-
- pass your model through the Model Test
- make sure it survives and doesn't go out of scope as your views did
-
@VRonin Yeah, I did that no errors, bro.
code what I did is: inside QWidget.new QAbstractItemModelTester(model,QAbstractItemModelTester::FailureReportingMode::Fatal);
-
-
-
@JonB changed all to the heap, I think they will stay till application die, right?
code I have changed:Widget::Widget(QWidget *parent) : QWidget(parent) { QFile file("path"); if(!file.open(QIODevice::ReadOnly|QIODevice::Text)) { qDebug()<<"can't access the file"; } QString *addresses=new QString(QString::fromUtf8(file.readAll())); Addressbookmodel *model=new Addressbookmodel(addresses,this); QListView *listView=new QListView(); listView->setModel(model); listView->setModelColumn(0); listView->show(); QTreeView *treeView=new QTreeView; treeView.setModel(model); treeView.show(); QTableView *tableView=new QTableView; tableView.setModel(model); tableView.show(); setMiniumSize(800,400); QVBoxLayout *Vlayout=new QVBoxLayout(this); Vlayout->addWidget(listView); Vlayout->addWidget(treeView); Vlayout->addWidget(tableView); }
-
@JonB changed all to the heap, I think they will stay till application die, right?
code I have changed:Widget::Widget(QWidget *parent) : QWidget(parent) { QFile file("path"); if(!file.open(QIODevice::ReadOnly|QIODevice::Text)) { qDebug()<<"can't access the file"; } QString *addresses=new QString(QString::fromUtf8(file.readAll())); Addressbookmodel *model=new Addressbookmodel(addresses,this); QListView *listView=new QListView(); listView->setModel(model); listView->setModelColumn(0); listView->show(); QTreeView *treeView=new QTreeView; treeView.setModel(model); treeView.show(); QTableView *tableView=new QTableView; tableView.setModel(model); tableView.show(); setMiniumSize(800,400); QVBoxLayout *Vlayout=new QVBoxLayout(this); Vlayout->addWidget(listView); Vlayout->addWidget(treeView); Vlayout->addWidget(tableView); }
-
Addressbookmodel *model=new Addressbookmodel(addresses,this); treeView.setModel(&model); tableView.setModel(&model);
Now that
model
is a pointer, why the&
s? -
Addressbookmodel *model=new Addressbookmodel(addresses,this); treeView.setModel(&model); tableView.setModel(&model);
Now that
model
is a pointer, why the&
s? -
I'm surprised you don't get into stack overflow.
AddressbookModel::rowCount
andAddressbookModel::columnCount
form an infinitely deep tree.You should
return 0;
if theparent
argumentisValid()
@VRonin okay,
In theAddressbookmodel.cpp
I changed the code to :int Addressbookmodel::rowCount(const QModelIndex &parent) const { if(parent.isValid()) { return 0; } return addressbook.count-2; } int Addressbookmodel::columnCount(const QModelIndex &parent) const { if(parent.isValid()) { return 0; } return addressbook.at(0).count(); }
I don't know why it is not used in the book and why am not getting data on the widgets still?.
-
I'm surprised you don't get into stack overflow.
AddressbookModel::rowCount
andAddressbookModel::columnCount
form an infinitely deep tree.You should
return 0;
if theparent
argumentisValid()
-
@VRonin Can share me an example that helps me to understand how to create
QTreeView
model and subclass it?, so from this I can able to create my own models successfully.@thippu said in Data not displaying on the QTreeView, QTableView,QListView classes:
Can share me an example that helps me to understand how to create QTreeView model and subclass it?
http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html
-
@thippu said in Data not displaying on the QTreeView, QTableView,QListView classes:
Can share me an example that helps me to understand how to create QTreeView model and subclass it?
http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html