因为,Qtreeview是层次容器,所以会复杂。尤其是加子行的时候。
首先,要找到是哪里加子行。有两个思路:位置索引还是item
1)用model的位置索引方式,定位到要加子行的QModelIndex.
2)用item方式,即后台以批量的list加树时,找到item的位置。
3)用model,如果后台的批量item加完就释放,若无从找到,有一个神器就是Model->itemFromIndex(myparent);这是索引和后台item的桥。
后两种方式归纳来看,也算是从item入手了,而且推荐都使用Item方式加子行,不然,可能会陷入到后台model和view中的QModelIndex的不同步,那个问题会让你乱套的。
然后,找到了加子行的点,就是要找方法了。
1)item->appendRow(传入item的list);
2)Model->insertRows(0, 1, myparent); // 添加一行,注意参数是QModelIndex,要理解树模型中子节点的索引机制
虽然,model有自己的appendRow函数,但是,加一行是没问题,分层次加子行时还是不行的。
而且,在分别使用item对象和QModelIndex对象的Data()和setData()时要注意,默认的role参数,一个是0,一个是257.这是绝对的坑儿。
不然,你设置了,总感觉设置的数据为空,不显示。role是一个新维度的概念,使用很方便,只要传入和调出控制好了,是一大神器。
resizecolumncontent也是个不错的技巧,可以在你设置了model后重新调用,根据内容适应宽度。
代码有点乱:但可以上两棵树,并且都有子行。
//测试绑定线路报文内容到树控件
QList <QStandardItem *> items;
QList <QStandardItem *> childItems;
for (int i = 0; i < 4; ++i)
{
QStandardItem *item = new QStandardItem( QString (“item L%0” ).arg(i));
if (0 == i)
item->setCheckable( true );
items.push_back(item);
}
lineModel->appendRow(items);
for (int i = 0; i < 4; ++i)
{
for (int i = 0; i < 4; ++i)
{
QStandardItem *item = new QStandardItem( QString (“L%0” ).arg(i));
if (0 == i)
item->setCheckable( true );
childItems.push_back(item);
}
items.at(i)->appendRow(childItems);
//lineModel->setItem(i, 0, childItems.at(i));
}
items.clear();
childItems.clear();
int iRow = -1;
for (int i = 0; i < 4; ++i)
{
for (int i = 0; i < 3; ++i)
{
QStandardItem *item = new QStandardItem( QString (“item R%0” ).arg(i));
if (0 == i)
item->setCheckable( true );
items.push_back(item);
}
//items.at(i)->appendRow(items);
//normalModel->setItem(i, items.at(0));
normalModel->appendRow(items);
items.clear();
iRow++;
}
//方式一,以setdata方式加子行
//QModelIndex myparent = normalModel->index(iRow,0);
// //myparent = normalModel->index(0, 0, myparent);
// normalModel->insertRows(0, 1, myparent); // 添加一行
// normalModel->insertColumns(0, 3, myparent); // 添加三列
// ui.treeView_normal->reset();
// ui.treeView_normal->setModel(normalModel);
// ui.treeView_normal->update();
// emit ui.treeView_normal->dataChanged(normalModel->index(0, 0), normalModel->index(0, 3, myparent));
////for (int i = 0; i<3; i++)
////{
// QModelIndex index = normalModel->index(0, 0, myparent);
// normalModel->setData(index, “kk”);
// ui.treeView_normal->reset();
// ui.treeView_normal->setModel(normalModel);
// ui.treeView_normal->update();
// emit ui.treeView_normal->dataChanged(normalModel->index(0, 0), index);
// normalModel->insertColumns(0, 1, myparent); // 添加一列
// index = normalModel->index(0, 1, myparent);
// normalModel->setData(index, “ll”);
// emit ui.treeView_normal->dataChanged(normalModel->index(0, 0), index);
// ui.treeView_normal->update();
// ui.treeView_normal->setModel(normalModel);
// normalModel->insertColumns(0, 1, myparent); // 添加一列
// index = normalModel->index(0, 2, myparent);
// normalModel->setData(index, “mm”);
// ui.treeView_normal->setModel(normalModel);
// ui.treeView_normal->update();
// //ui.treeView_normal->paintEvent()
// emit ui.treeView_normal->dataChanged(normalModel->index(0, 0), index);
// ui.treeView_normal->reset();
////}
//myparent = lineModel->index(0,0);
//QModelIndex tmp = lineModel->index(0, 0,myparent);
// ui.treeView_line->setCurrentIndex(tmp);
//方式二,以model的setitem方式加行
QModelIndex myparent = normalModel->index(iRow, 0);
for (int i = 0; i < 3; ++i)
{
QStandardItem *item = new QStandardItem( QString (“R%0” ).arg(i));
if (0 == i)
item->setCheckable( true );
childItems.push_back(item);
}
//items.at(i)->appendRow(childItems);
QStandardItem * tmp = normalModel->itemFromIndex(myparent);
tmp->appendRow(childItems);
childItems.clear();
//normalModel->setItem(iRow, 0, childItems.at(0));
QStandardItem *item = new QStandardItem( QString (“RE%0” ).arg(0));
childItems.push_back(item);
item = new QStandardItem ( QString( “RE%0” ).arg(1));
childItems.push_back(item);
item = new QStandardItem ( QString( “RE%0” ).arg(2));
childItems.push_back(item);
normalModel->appendRow(childItems);