1、TreeWidget
PS:主要是用于只有一个根节点的需求
①、显示
拖出TreeWidget控件,名称treeWidget
ui->treeWidget->setColumnCount(1); //设置列数
ui->treeWidget->setHeaderLabel(tr("图像选择")); //设置头的标题
QTreeWidgetItem *imageItem1 = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("图像1")));
imageItem1->setIcon(0,QIcon(":/img/1.png"));
QTreeWidgetItem *imageItem1_1 = new QTreeWidgetItem(imageItem1,QStringList(QString("Band1"))); //子节点1
imageItem1_1->setIcon(0,QIcon(":/img/1.png"));
imageItem1->addChild(imageItem1_1); //添加子节点
//以此类推可以添加更多行
ui->treeWidget->expandAll(); //结点全部展开
效果:

②获取(单击/双击)的节点序号:
slots:
void showSelectedImage(QTreeWidgetItem*,int);//单击
void showSelectedImage2(QTreeWidgetItem*,int);//双击
//单击
connect(ui->treeWidget,SIGNAL(itemClicked(QTreeWidgetItem*,int)),this,SLOT(showSelectedImage(QTreeWidgetItem*,int)));
//双击
connect(ui->treeWidget,SIGNAL(itemActivated(QTreeWidgetItem*,int)),this,SLOT(showSelectedImage2(QTreeWidgetItem*,int)));
//单击
void QMySerialPort::showSelectedImage(QTreeWidgetItem *item, int column)//column为列号
{
//不能判断是那个根节点,只能判断节点的序号
QTreeWidgetItem *parent = item->parent();
if(NULL == parent) //注意:最顶端项是没有父节点的,双击这些项时注意(陷阱)
return;
int number = parent->indexOfChild(item); //item在父项中的节点行号(从0开始)
ui->pushButton->setText(QString::number(number));
}
//双击
void QMySerialPort::showSelectedImage2(QTreeWidgetItem *item, int column)//column为列号
{
//不能判断是那个根节点,只能判断节点的序号
QTreeWidgetItem *parent = item->parent();
if(NULL == parent) //注意:最顶端项是没有父节点的,双击这些项时注意(陷阱)
return;
int number = parent->indexOfChild(item); //item在父项中的节点行号(从0开始)
ui->pushButton->setText(QString::number(number));
}
③节点操作
.h
slots:
void on_tv_Source_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
public:
QTreeWidgetItem *AddTreeRoot(QString name,QString desc);
QTreeWidgetItem *AddTreeNode(QTreeWidgetItem *parent,QString name,QString desc);
.cpp
初始化:
ui->treeWidget->setColumnCount(1); //设置列数
ui->treeWidget->setHeaderLabel(tr("图像选择")); //设置头的标题
QTreeWidgetItem *imageItem1 = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("图像1")));
imageItem1->setIcon(0,QIcon(":/img/1.png"));
QTreeWidgetItem *imageItem1_1 = new QTreeWidgetItem(imageItem1,QStringList(QString("Band1"))); //子节点1
imageItem1_1->setIcon(0,QIcon(":/img/1.png"));
imageItem1->addChild(imageItem1_1); //添加子节点
ui->treeWidget->expandAll(); //结点全部展开
connect(ui->treeWidget,SIGNAL(currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)),
this,SLOT(on_tv_Source_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)));
connect(ui->treeWidget,SIGNAL(itemActivated(QTreeWidgetItem*,int)),this,SLOT(showSelectedImage(QTreeWidgetItem*,int)));
connect(ui->pushButton_2,&QPushButton::clicked,[=]()
{
QTreeWidgetItem * item= ui->treeWidget->currentItem();
if(item!=Q_NULLPTR)
{
AddTreeNode(item,"new","new");
}
else
{
AddTreeRoot("new","new");
}
});
connect(ui->pushButton_3,&QPushButton::clicked,[=]()
{
AddTreeRoot("new","new");
});
connect(ui->pushButton_4,&QPushButton::clicked,[=]()
{
QTreeWidgetItem * currentItem = ui->treeWidget->currentItem();
if(currentItem==Q_NULLPTR)
{
return;
}
//如果没有父节点就直接删除
if(currentItem->parent()==Q_NULLPTR)
{
delete ui->treeWidget->takeTopLevelItem(ui->treeWidget->currentIndex().row());
}
else
{
//如果有父节点就要用父节点的takeChild删除节点
delete currentItem->parent()->takeChild(ui->treeWidget->currentIndex().row());
}
});
connect(ui->pushButton_5,&QPushButton::clicked,[=]()
{
QTreeWidgetItem * currentItem = ui->treeWidget->currentItem();
if(currentItem==Q_NULLPTR)
{
return;
}
for(int i=0;i<currentItem->columnCount();i++)
{
currentItem->setText(i,tr("Modify")+QString::number(i));
}
});
添加功能函数:
QTreeWidgetItem * QMySerialPort::AddTreeRoot(QString name,QString desc)
{
QTreeWidgetItem * item=new QTreeWidgetItem(QStringList()<<name<<desc);
ui->treeWidget->addTopLevelItem(item);
return item;
}
QTreeWidgetItem * QMySerialPort::AddTreeNode(QTreeWidgetItem *parent,QString name,QString desc)
{
QTreeWidgetItem * item=new QTreeWidgetItem(QStringList()<<name<<desc);
parent->addChild(item);
return item;
}
void QMySerialPort::on_tv_Source_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{
if(current==Q_NULLPTR)
return;
if(previous != Q_NULLPTR)
{
previous->setBackground(0,Qt::transparent);
previous->setTextColor(0,Qt::black);
}
current->setTextColor(0,Qt::blue);
current->setBackground(0,Qt::red);
}
void QMySerialPort::showSelectedImage(QTreeWidgetItem *item, int column)
{
QTreeWidgetItem *parent = item->parent();
if(NULL == parent) //注意:最顶端项是没有父节点的,双击这些项时注意(陷阱)
return;
int number = parent->indexOfChild(item); //item在父项中的节点行号(从0开始)
ui->pushButton->setText(QString::number(number));
}
箭头所指为双击节点的序号
④、TreeWidget添加快捷菜单
参考:QListWidget添加快捷菜单,https://blog.csdn.net/bigtree_mfc/article/details/102607293
注意问题:
将参数const QPoint &pos换成QPoint point
customContextMenuRequested(QPoint point)
直接添加
connect(ui->treeWidget,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(on_customContextMenuRequested(QPoint)));
后续都一样
⑤、自定义展开和收缩三角形的图片
ui->treeWidget->setStyleSheet("QTreeView::branch:has-children:!has-siblings:closed,"
"QTreeView::branch:closed:has-children:has-siblings {"
"border-image: none;"
"image: url(:/img/24.png);"//展开的图标
"}"
"QTreeView::branch:open:has-children:!has-siblings,"
"QTreeView::branch:open:has-children:has-siblings {"
"border-image: none;"
"image: url(:/img/24.png);"//收缩的图标
"}");
⑥、选中背景颜色修改
connect(ui->treeWidget,&QTreeWidget::currentItemChanged,[=](QTreeWidgetItem *pItem1, QTreeWidgetItem *pItem2)
{
QColor m_color_cur = QColor(255,0,0);//选中的颜色修改
pItem1->setBackgroundColor(0,m_color_cur);
QColor m_color_pre = QColor(128,128,128);//上次选中背景色修改
pItem2->setBackgroundColor(0,m_color_pre);
});
⑦多选和获取状态
ui->treeWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);//多选
//获取多选选中项内容
QString str;
QList<QTreeWidgetItem*> TreeleItemList = ui->treeWidget->selectedItems();
for(int i = 0; i < TreeleItemList.size(); i++)
{
str.append(TreeleItemList[i]->text(0) + ",");
}
str = str.left(str.size() - 1);
qDebug() << str;