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;