PDA

View Full Version : QStandardItemModel's insertRow() did't make a grandchild item in QTreeView



kichi
11th January 2010, 10:44
When I intended to write a small code using QTreeView and QStandardItemModel.
I encountered a problem.

When I made a grandchild item, using QStandardItemModel::insertRow(int row, const QModelIndex & parent = QModelIndex()),
the item did not appeared in the tree view.

In the following code, Case1 worked good.
But, contrary to my expectation, Case2 did not work.

Is it correct to make a grandchild item, using QStandardItemModel::insertRow() ?



#include <QtGui/QApplication>
#include <QtCore/QModelIndex>
#include <QtGui/QStandardItem>
#include <QtGui/QStandardItemModel>
#include <QTreeView>
#include <QtDebug>

int main(int argc, char *argv[])
{
QApplication application(argc, argv);

QStandardItemModel model;
QTreeView treeView;
treeView.setModel(&model);

// (Case 1)
// QStandardItem* rootItem = model.invisibleRootItem();
// rootItem->insertRow(0, new QStandardItem("Child Item"));
// QStandardItem* childItem = rootItem->child(0, 0);
// if (childItem)
// childItem->insertRow(0, new QStandardItem("Grandchild Item"));

// (Case 2)
model.insertRow(0, new QStandardItem("Child Item"));
QModelIndex childItemIndex = model.index(0, 0, QModelIndex());
bool isSuccess = false;
if (childItemIndex.isValid()) {
isSuccess = model.insertRow(0, childItemIndex); // make a grandchild, but the item does not appear
}
qDebug() << "isSuccess : " << isSuccess; // true

childItemIndex = model.index(0, 0, QModelIndex());
qDebug() << "childItemIndex.isValid : " << childItemIndex.isValid(); // true
QModelIndex grandchildItemIndex = model.index(0, 0, childItemIndex);
qDebug() << "grandchildItemIndex.isValid() : " << grandchildItemIndex.isValid(); // false

treeView.show();

return application.exec();
}


I'm sorry in poor English.

numbat
11th January 2010, 11:08
You need to insert a column as well. The insertRow which takes a QStandardItem does this automatically.


if (childItemIndex.isValid()) {
isSuccess = model.insertRow(0, childItemIndex); // make a grandchild, but the item does not appear
isSuccess = model.insertColumn(0, childItemIndex); // Need this...
}

kichi
11th January 2010, 11:39
You need to insert a column as well. The insertRow which takes a QStandardItem does this automatically.


if (childItemIndex.isValid()) {
isSuccess = model.insertRow(0, childItemIndex); // make a grandchild, but the item does not appear
isSuccess = model.insertColumn(0, childItemIndex); // Need this...
}


Your advice has solved the problem.
Thank you very much.