功能截图:
树控件treewidget的最上方有一标题栏,如图共有3列column。下面的每一行由一项item占用,每项item有多列column,每一列表示该项的一个属性。
每个item可以添加子项,如图中的HW是ZZN的子项。
每一项的每一个column中,可显示text,可添加显示icon,可设置多个data。
代码实现:
1、设置树控件的列数和宽度:
ui->m_treeWidget->setColumnCount(3);
ui->m_treeWidget->setColumnWidth(0,100);
2、设置标题:
QStringList headers;
headers.append("name");
headers.append("gender");
headers.append("height");
ui->m_treeWidget->setHeaderLabels(headers);
3、读入icon:
QIcon icon_male("C:/Users/Maggie/Downloads/male.png");
QIcon icon_female("C:/Users/Maggie/Downloads/female.png");
4、插入数据:
QTreeWidgetItem *zzn=AddItem("ZZN",false,174,NULL,icon_female);
AddItem("HW",true,184,zzn,icon_male);
5、AddItem函数:
QTreeWidgetItem *MainWindow::AddItem(const QString &name,const bool gender,const int height,QTreeWidgetItem *parent,QIcon icon)
{
QTreeWidgetItem * item=new QTreeWidgetItem();
item->setText(0,name);
item->setText(1,QString::number(gender)); //bool类型转换成QString
item->setText(2,QString::number(height)); //int类型转换成QString
item->setIcon(1,icon);
item->setData(1,Qt::UserRole+1,gender);
item->setData(2,Qt::UserRole+2,height);
if(parent) //如果有父结点,则将此item添加给父结点
{
parent->addChild(item);
}
else //如果没有父结点,则将此item添加给treewidget的最顶层(最后)
{
ui->m_treeWidget->addTopLevelItem(item);
}
return item;
}
调试总结:
1、一开始,窗口是并列显示的两条item。设置断点发现“HW”项的第四个参数parent本应传入ZZN但却是空指针。后来发现忘记写AddItem函数的返回值 return item,然而编译器竟然编译通过。
2、由于树控件的每个column像列表控件的每一项那样有自己独立的text icon data,所以很多与item有关的函第一个参数往往都要指明针对哪一列column操作。如:
item->setData(1,Qt::UserRole+1,gender);
item->setText(2,QString::number(height));
item->setIcon(1,icon);
3、setText第二个参数text是QString类型:
int转QString:QString::number(size);
bool转QString:QString::number(gender);