Data not displaying on the QTreeView, QTableView,QListView classes
-
Hi,
-
I'm subclassing
QAbstractTableModel
class, calledclass Addressbookmodel
and I'm populating the model. -
On
QWidget
, I'm creatingQVBoxLayout
and setting it as the main layout for the view and addingQTreeView,QTableView,QListView
objects to it. -
file path and accessing are working fine.
But problem is, -
QTreeView, QTableview
created on a stack is not getting displayed on the widget(at least it should show the layout of the widget, right?, why object created on the heap are shown because I have createdQListView
on heap memory, it is shown on the widget with empty data from the model -
why the model data is not showing?
code: widget.cpp
Widget::Widget(QWidget *parent) : QWidget(parent) { QFile file("path"); if(!file.open(QIODevice::ReadOnly|QIODevice::Text)) { qDebug()<<"can't access the file"; } QString addresses=QString::fromUtf8(file.readAll()); Addressbookmodel model(addresses); QListView *listView=new QListView(); listView->setModel(&model); listView->setModelColumn(0); listView->show(); QTreeView treeView; treeView.setModel(&model); treeView.show(); QTableView tableView; tableView.setModel(&model); tableView.show(); setMiniumSize(800,400); QVBoxLayout *Vlayout=new QVBoxLayout(this); Vlayout->addWidget(listView); Vlayout->addWidget(&treeView); Vlayout->addWidget(&tableView); }
csv file:
'Name', 'Address'
'thippu', 'talacaverlayout' -
-
Hi,
-
I'm subclassing
QAbstractTableModel
class, calledclass Addressbookmodel
and I'm populating the model. -
On
QWidget
, I'm creatingQVBoxLayout
and setting it as the main layout for the view and addingQTreeView,QTableView,QListView
objects to it. -
file path and accessing are working fine.
But problem is, -
QTreeView, QTableview
created on a stack is not getting displayed on the widget(at least it should show the layout of the widget, right?, why object created on the heap are shown because I have createdQListView
on heap memory, it is shown on the widget with empty data from the model -
why the model data is not showing?
code: widget.cpp
Widget::Widget(QWidget *parent) : QWidget(parent) { QFile file("path"); if(!file.open(QIODevice::ReadOnly|QIODevice::Text)) { qDebug()<<"can't access the file"; } QString addresses=QString::fromUtf8(file.readAll()); Addressbookmodel model(addresses); QListView *listView=new QListView(); listView->setModel(&model); listView->setModelColumn(0); listView->show(); QTreeView treeView; treeView.setModel(&model); treeView.show(); QTableView tableView; tableView.setModel(&model); tableView.show(); setMiniumSize(800,400); QVBoxLayout *Vlayout=new QVBoxLayout(this); Vlayout->addWidget(listView); Vlayout->addWidget(&treeView); Vlayout->addWidget(&tableView); }
csv file:
'Name', 'Address'
'thippu', 'talacaverlayout'@thippu said in Data not displaying on the QTreeView, QTableView,QListView classes:
QTreeView, QTableview created on a stack is not getting displayed
Because they go out of scope and get deleted before they can get displayed. The same is true for your model
-
-
Hi,
-
I'm subclassing
QAbstractTableModel
class, calledclass Addressbookmodel
and I'm populating the model. -
On
QWidget
, I'm creatingQVBoxLayout
and setting it as the main layout for the view and addingQTreeView,QTableView,QListView
objects to it. -
file path and accessing are working fine.
But problem is, -
QTreeView, QTableview
created on a stack is not getting displayed on the widget(at least it should show the layout of the widget, right?, why object created on the heap are shown because I have createdQListView
on heap memory, it is shown on the widget with empty data from the model -
why the model data is not showing?
code: widget.cpp
Widget::Widget(QWidget *parent) : QWidget(parent) { QFile file("path"); if(!file.open(QIODevice::ReadOnly|QIODevice::Text)) { qDebug()<<"can't access the file"; } QString addresses=QString::fromUtf8(file.readAll()); Addressbookmodel model(addresses); QListView *listView=new QListView(); listView->setModel(&model); listView->setModelColumn(0); listView->show(); QTreeView treeView; treeView.setModel(&model); treeView.show(); QTableView tableView; tableView.setModel(&model); tableView.show(); setMiniumSize(800,400); QVBoxLayout *Vlayout=new QVBoxLayout(this); Vlayout->addWidget(listView); Vlayout->addWidget(&treeView); Vlayout->addWidget(&tableView); }
csv file:
'Name', 'Address'
'thippu', 'talacaverlayout'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
!) -
-
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
!)@JonB said in Data not displaying on the QTreeView, QTableView,QListView classes:
Or, you might get away with making them members
If you do you must be careful that they must go out of scope before the parent tries to call
delete
on them. Usually it's not worth the effort and it's just better to allocate widgets on the heap -
@JonB said in Data not displaying on the QTreeView, QTableView,QListView classes:
Or, you might get away with making them members
If you do you must be careful that they must go out of scope before the parent tries to call
delete
on them. Usually it's not worth the effort and it's just better to allocate widgets on the heap@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! -
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