ui.setupUi(this);
connect(ui.deleteItems, SIGNAL(clicked()), this, SLOT(OnBtnClicked())); // signal->slot
ui.treeWidget->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection); // 设置多选,单选
ui.treeWidget->setColumnCount(1); // 设置列的数目
//ui.treeWidget->setStyleSheet("QTreeWidget::item{height:75px}"); // 设置QSS——行的高度(行间距),可以在designer里面设置!
// root 1
myWidget* aRoot_widget_1 = new myWidget;
QTreeWidgetItem* arootItem_1 = new QTreeWidgetItem(ui.treeWidget);
ui.treeWidget->setItemWidget(arootItem_1, 0, aRoot_widget_1);
// root1->child1
QTreeWidgetItem* childItem_1 = new QTreeWidgetItem(arootItem_1);
childWidget* child_widget_1 = new childWidget;
child_widget_1->SetInfo(QString("child_1"));
ui.treeWidget->setItemWidget(childItem_1, 0, child_widget_1);
// root1->child2
QTreeWidgetItem* childItem_2 = new QTreeWidgetItem(arootItem_1);
childWidget* child_widget_2 = new childWidget;
child_widget_2->SetInfo(QString("child_2"));
ui.treeWidget->setItemWidget(childItem_2, 0, child_widget_2);
// root2
myWidget* aRoot_widget_2 = new myWidget;
QTreeWidgetItem* aRootItem_2 = new QTreeWidgetItem(ui.treeWidget);
ui.treeWidget->setItemWidget(aRootItem_2, 0, aRoot_widget_2);
// root2->child3
QTreeWidgetItem* childItem_3 = new QTreeWidgetItem(aRootItem_2);
childWidget* child_widget_3 = new childWidget;
child_widget_3->SetInfo(QString("child_3"));
ui.treeWidget->setItemWidget(childItem_3, 0, child_widget_3);
// root2->child4
QTreeWidgetItem* childItem_4 = new QTreeWidgetItem(aRootItem_2);
childWidget* child_widget_4 = new childWidget;
child_widget_4->SetInfo(QString("child_4"));
ui.treeWidget->setItemWidget(childItem_4, 0, child_widget_4);
ui.treeWidget->removeItemWidget(childItem_4, 0);
// 说明:
1.myWidget和childWidget为自定义widget(继承于QWidget)widget控件,添加方法为在vs2008/2010/2012里面右键选择“添加类”->"Qt4/5GuiClass";
2.在添加自定义widget控件后在QTreeWidget里面可能会出现看不到自定义widget控件的问题,出现问题的原因是QTreeWidget控件的行间距没有设置正确,但是很奇怪的是通过QTreeWidget的setLineWidth方法却不能起作用,正确的做法是设置QTreeWidgetd的CSS属性,具体方法为右键选择“改变样式表...”(在designer里面进行操作),然后在里面添加
#treeWidget::item
{
height:75px;
width:300px;
}
其中#的意思为treeWidget为该样式表的名字,也可以选择直接输入height:75px;width:300px;表示不给该样式表起名字;
此外,还可以通过在代码中设置QTreeWidget的样式表,ui.treeWidget->setStyleSheet("QTreeWidget::item{height:75px}");
// one more(下划线)
text-decoration:underline; // 下划线
text-decoration:overline; // 上划线
(QSS < CSS)
3.关于setItemWidget方法介绍:
void setItemWidget(QTreeWidgetItem *item, int column, QWidget *widget);
第一个参数为一个QTreeWidgetItem对象,需要明确的是我们的自定义的widget控件是依托于/存在于/放在QTreeWidgetItem对象上面的,这样以后就把QTreeWidgetItem对象与我们自定义的widget对象联系起来了;
第二个参数为列,指第几列;
第三个参数为我们自定义的widget控件。
需要理解QTreeWidget里面的父与子的关系!
4.关于QTreeWidgetItem的构造函数,这里用到了它的两种构造函数,一种是
explicit QTreeWidgetItem(QTreeWidget *view, int type = Type); (在本例中为构造root节点)
一种是:
explicit QTreeWidgetItem(QTreeWidgetItem *parent, int type = Type);(在本例中为构造子节点,即root节点的字节点,所以parent即为通过上面构造函数创建的QTreeWidgetItem)。
5.本例效果图如下:
6.补注:
自定义widget被遮挡问题的解决办法除了上述解决办法外(上述解决办法有一个缺陷,即只能设置单一行高度,所有的行都用同一个行高度,不自由),最好的解决办法是设定自定义widget的最大宽度、高度和最小宽度、最小高度为自定义的宽度和高度即可解决该问题。