在界面上拉一個 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();
}
添加數據之後的效果如下: