天天看點

QT開發之TreeWidget、TreeView控件

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(); //結點全部展開
           

效果:

QT開發之TreeWidget、TreeView控件

②擷取(單擊/輕按兩下)的節點序号:

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));
}
           

箭頭所指為輕按兩下節點的序号

QT開發之TreeWidget、TreeView控件

④、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;
           

繼續閱讀