QT之QTreeWidget的使用

QTreeWidget使用

  • QTreeWidget的基本使用
  1. 创建基础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的基本都是如此添加,就不做特殊描述
QTreeWidgetItem中加入自定义控件
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内嵌QTableWidget

  • 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);来手动设置每列的宽度,实现改变顶层列宽,
    内部表格列宽也发生变化。
    
    
  • 29
    点赞
  • 157
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值