Qt學習筆記(十九):QTreeWidget 的常用方法


在界面上拉一個 Tree Widget 控件和五個按鈕控件:

widget.cpp 文件如下: 

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QMessageBox>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    // 雙擊控件,進行編輯
    connect(ui->treeWidget, &QTreeWidget::itemDoubleClicked, [=](QTreeWidgetItem * item, int column){
        qDebug() << column << item->text(column).toUtf8().data();
        
        // 設置允許編輯
        item->setFlags(item->flags() | Qt::ItemIsEditable);
    });
}

Widget::~Widget()
{
    delete ui;
}

// 添加
void Widget::on_btnAdd_clicked()
{
    // 添加標題頭
    ui->treeWidget->setHeaderLabels(QStringList() << "英雄姓名" << "英雄介紹");
//    ui->treeWidget->setColumnWidth(0, 100); // 設置列寬
//    ui->treeWidget->setColumnWidth(1, 300);
    
    QFont font;
    font.setBold(true);
    font.setFamily("宋體");
    font.setPointSize(16);
    ui->treeWidget->header()->setFont(font); // 設置標題的字體
    
    ui->treeWidget->header()->setDefaultAlignment(Qt::AlignCenter); // 設置居中顯示
    
    
    // 設置 header 的約束模式:ResizeToContents 表示 header 大小根據內容自動調整;
    // 設置了 ResizeToContents 模式,則前面 setColumnWidth 方法設置的列寬無效;
    ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
    // 設置最後一個 header 是否佔用所有可用空間;默認值爲 false;
    // 如果爲 false,當內容不足以完全顯示內容時,會自動添加滾動條;
    // 如果爲 true,則不會自動添加滾動條;
    ui->treeWidget->header()->setStretchLastSection(false);
    
    // 添加項
    QTreeWidgetItem * liItem  = new QTreeWidgetItem(QStringList() << "力量");
    QTreeWidgetItem * minItem  = new QTreeWidgetItem(QStringList() << "敏捷");
    QTreeWidgetItem * zhiItem  = new QTreeWidgetItem(QStringList() << "智力");
    
    // 添加頂層項目
    ui->treeWidget->addTopLevelItem(liItem);
    ui->treeWidget->addTopLevelItem(minItem);
    ui->treeWidget->addTopLevelItem(zhiItem);

    QStringList heroL1;
    QStringList heroL2;
    QStringList heroM1;
    QStringList heroM2;
    QStringList heroZ1;
    QStringList heroZ2;
    
    heroL1 << "剛被豬" << "前排坦克,能在吸收傷害的同時造成可觀的範圍輸出";
    heroL2 << "船長" << "前排坦克,能肉能輸出能控場的全能英雄";

    heroM1 << "月騎" << "中排物理輸出,可以使用分裂利刃攻擊多個目標";
    heroM2 << "小魚人" << "前排戰士,擅長偷取敵人的屬性來增強自身戰力";

    heroZ1 << "死靈法師" << "前排法師坦克,魔法抗性較高,擁有治療技能";
    heroZ2 << "巫醫" << "後排輔助法師,可以使用奇特的巫術詛咒敵人與治療隊友";

    // 追加子項目 子項也是 QTreeWidgetItem
    QTreeWidgetItem * li1 = new QTreeWidgetItem(heroL1);
    liItem->addChild(li1);
    
    QTreeWidgetItem * li2 =new QTreeWidgetItem(heroL2);
    liItem->addChild(li2);
    
    QTreeWidgetItem * Min1 =new QTreeWidgetItem(heroM1);
    minItem->addChild(Min1);
    
    QTreeWidgetItem * Min2 =new QTreeWidgetItem(heroM2);
    minItem->addChild(Min2);
    
    QTreeWidgetItem * Zhi1 =new QTreeWidgetItem(heroZ1);
    zhiItem->addChild(Zhi1);
    
    QTreeWidgetItem * Zhi2 =new QTreeWidgetItem(heroZ2);
    zhiItem->addChild(Zhi2);
}

// 插入
void Widget::on_btnInsert_clicked()
{
    qDebug() << ui->treeWidget->header()->count();  // header列的數量
    qDebug() << ui->treeWidget->columnCount();      // 列的數量
    qDebug() << ui->treeWidget->topLevelItemCount();// 頂層 item 的數量
    
    // 新創建一個頂層項
    QTreeWidgetItem *adcItem = new QTreeWidgetItem(QStringList() << "ADC");
    
    // 在所有頂層項的最後插入新創建的頂層項
    ui->treeWidget->insertTopLevelItem(ui->treeWidget->topLevelItemCount(), adcItem);
    
    QStringList adcList1;
    adcList1 << "寒冰射手" << "阿瓦羅薩部族的戰母,身具寒冰血脈的艾希,是蠻子的老婆!";
    
    QStringList adcList2;
    adcList2 << "皮城女警" << "皮特沃城的女警花,以懲治犯罪爲自己的人生目標!";
    
    // 追加子項
    QTreeWidgetItem *hbItem = new QTreeWidgetItem(adcList1);
    QTreeWidgetItem *njItem = new QTreeWidgetItem(adcList2);
    adcItem->addChild(hbItem);
    adcItem->addChild(njItem);
}

// 刪除
void Widget::on_btnDelete_clicked()
{
    // 獲取當前選中的項
    QTreeWidgetItem *item = ui->treeWidget->currentItem();
    if (item == NULL)
    {
        QMessageBox::warning(this, "系統提示", "沒有選擇任何項!");
    }
    else
    {
        qDebug() << item->columnCount();
        qDebug() << item->text(0).toUtf8().data();
        qDebug() << item->text(1).toUtf8().data();
        
        if (QMessageBox::question(this, "系統提示", "確定要刪除選中的項嗎?") == QMessageBox::Yes)
        {
            // 獲取當前選中節點的父對象,如果父對象爲 NULL,則說明當前選中節點爲頂層節點
            QTreeWidgetItem *parentItem = item->parent();
            if (parentItem == NULL)
            {
                qDebug() << "當前節點爲頂層節點";
                
                // 獲取當前選中節點的行索引
                QModelIndex index = ui->treeWidget->currentIndex();
                qDebug() << QString::number(index.row());
                
                // 根據索引刪除頂層節點
                QTreeWidgetItem *delItem = ui->treeWidget->takeTopLevelItem(index.row());
                ui->treeWidget->removeItemWidget(delItem, index.column());
            }
            else
            {
                // 非頂層節點的刪除:使用父節點移除當前子節點
                parentItem->removeChild(item);
            }
        }
    }
}

// 修改
void Widget::on_btnUpdate_clicked()
{
    // 在構造函數中添加雙擊 item 的事件處理程序了
}

// 查找
void Widget::on_btnFind_clicked()
{
    // 獲取當前選中的列
    int column = ui->treeWidget->currentColumn();
    qDebug() << QString::number(column);
    
    // 獲取當前選中項的索引
    int row = ui->treeWidget->currentIndex().row();
    column = ui->treeWidget->currentIndex().column();
    qDebug() << QString::number(row) << QString::number(column);
    
    // 獲取當前選中項的對象
    QTreeWidgetItem *item = ui->treeWidget->currentItem();
    qDebug() << item->text(column).toUtf8().data();
}

添加數據之後的效果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章