QTreeWidget使用
- QTreeWidget的基本使用
- 创建基础QTreeWidget
ui->treeWidget->setColumnCount(3);
ui->treeWidget->setHeaderLabels(QStringList()<<"编号"<<"启用"<<"描述");
QList<QString> allItemName{"10","否","第一层Item"};
//创建顶层Item
QTreeWidgetItem* newTopItem = new QTreeWidgetItem(allItemName);
ui->treeWidget->addTopLevelItem(newTopItem);
//获取顶层节点
QTreeWidgetItem* topItem = ui->treeWidget->topLevelItem(0);
//创建子节点
QTreeWidgetItem* childItem = new QTreeWidgetItem(QStringList{"10-1","是","第二层Item"});
//将子节点添加到顶层节点上
topItem->addChild(childItem);
效果图:
2. 在QTreeWidget中的非顶层Item加入自定义控件(QPushButton,QCheckBox…)
//创建子节点
QTreeWidgetItem* secChildItem = new QTreeWidgetItem(QStringList{"10-2","","第二层Item"});
topItem->addChild(secChildItem); //将子节点添加到顶层节点上
QCheckBox* checkBox = new QCheckBox();
checkBox->setText("启用");
ui->treeWidget->setItemWidget(secChildItem,1,checkBox);
//创建子节点
QTreeWidgetItem* thrChildItem = new QTreeWidgetItem(QStringList{"10-3","","第二层Item"});
topItem->addChild(thrChildItem); //将子节点添加到顶层节点上
//创建自定义控件
QPushButton* button = new QPushButton("测试",this);
ui->treeWidget->setItemWidget(thrChildItem,1,button);
效果图如下,其他的派生于QWidget的基本都是如此添加,就不做特殊描述
3. 在QTreeWidget中内嵌QTableWidget表格
ui->treeWidget->setHeaderLabels(QStringList()<<"编号"<<"启用"<<"描述");
QList<QString> allItemName{"10","否","第一层Item"};
//创建顶层Item
QTreeWidgetItem* newTopItem = new QTreeWidgetItem(QStringList{"10","",""});
ui->treeWidget->addTopLevelItem(newTopItem);
//获取顶层节点
QTreeWidgetItem* topItem = ui->treeWidget->topLevelItem(0);
#if 1
//获取顶层节点
QTreeWidgetItem* seconeItem = new QTreeWidgetItem();
topItem->addChild(seconeItem);
//创建内嵌窗口
HTDOperatorControlWidget* subWidget = new HTDOperatorControlWidget(this);
subWidget->setFixedHeight(60);
seconeItem->setFirstColumnSpanned(true); //设置Item的第一列宽度占据整个窗口的宽度,
ui->treeWidget->setItemWidget(seconeItem,0,subWidget);
#endif
效果图如下
-
QTreeWidget的进阶使用小技巧
(一)、QTreeWidget的Item展开情况:
1.显示时,所有Item展开://数据添加完成,保证所有数据都是展开形状 ui->treeWidget->setItemsExpandable(true); //子Item是否可以被展开 ui->treeWidget->expandAll();
2.点击顶层Item项时,其内部所有的Item被展开:
暂时未写,可借鉴Qt文档中的 void expandItem(const QTreeWidgetItem *item);内置槽函数来完成
(二)、右击QTreeWidgetItem弹出菜单:
1.鼠标右击Item弹出相同菜单
1.在UI界面中创建QTreeWidget,关联QTreeWidget的customContextMenuRequested信号 connect(ui->treeWidget,&QTreeWidget::customContextMenuRequested,this,&DataMonitor::EquListTreeShowRightMenu); //在槽函数EquListTreeShowRightMenu中进行处理,这个槽函数是自己定义的 QTreeWidgetItem *clickedItem = ui->treeWidget->itemAt(pos); if(clickedItem != NULL) { topItemMoveMenu->exec(QCursor::pos()); //弹出菜单 }
2.鼠标右击不同层次Item,弹出不同菜单
1.在UI界面中创建QTreeWidget,关联QTreeWidget的customContextMenuRequested信号 connect(ui->treeWidget,&QTreeWidget::customContextMenuRequested,this,&DataMonitor::EquListTreeShowRightMenu); //在槽函数EquListTreeShowRightMenu中进行处理,这个槽函数是自己定义的 QTreeWidgetItem *clickedItem = ui->treeWidget->itemAt(pos); if(clickedItem != NULL) { QTreeWidgetItem *tmpItem = clickedItem; QTreeWidgetItem *equItem = NULL; int conutLevel = 1; //循环判断是那一层的Item while(tmpItem->parent()) { conutLevel++; tmpItem = tmpItem->parent(); } //右键弹出响应菜单 if(conutLevel == 1) { topItemMoveMenu->exec(QCursor::pos()); //弹出第一层Item对应的菜单 } if(conutLevel == 2) { equTreeEquMenu->exec(QCursor::pos()); //弹出第二层Item对应的菜单 } }
(三)、如何保持多列QTreeWidget的每列宽度同步到内部QTableWidget中
思路:QTreeWidget中提供了一个 void sectionResized(int logicalIndex, int oldSize, int newSize);信号, 用来告诉那一列的宽度发生了变化或者哪一行的高度发生了变化,两个参数分别表示改变前的宽度/高度和改变后的宽度和高度;只 需要写一个槽函数,配合 void setColumnWidth(int column, int width);来手动设置每列的宽度,实现改变顶层列宽, 内部表格列宽也发生变化。