文章目錄
- 1. QListWidget
- 1.1 常用屬性和方法
- 1.2 常用信號
- 1.4 例子1,操作元素
- 2. QTableWidget
- 2.1 常用屬性和方法
- 2.2 常用信號
- 2.3 例子1,創建表格
- 3.1 常用屬性和方法
- 3.2 常用信號
- 3.3 例子1,創建樹形結構
Qt中提供的多元素控件有:
QListWidget
QListView
QTableWidget
QTableView
QTreeWidget
QTreeView
xxWidget
和xxView
之間的區別:
xxWidget
xxWidget
屬于便捷類控件,它將數據存儲和顯示邏輯集成在一起,提供了一種簡單直接的方式來創建和管理表格、樹形結構等界面元素。開發者無需過多關注數據模型的設計,就能快速搭建出具有基本功能的界面。(簡單,但是拓展性低)
xxView
xxView
基于模型 - 視圖 - 控制器(MVC)架構設計,遵循分離原則,將數據的存儲(模型)和顯示(視圖)分離開來。這種設計使得數據和界面的管理更加靈活,方便進行數據的修改、擴展和復用。(復雜,但是拓展性高)
1. QListWidget
QListWidget
表示一個縱向的列表
1.1 常用屬性和方法
屬性
屬性 | 說明 | 類型 | 讀寫性 | 取值范圍或可能值 |
---|---|---|---|---|
currentRow | 表示當前被選中的行的索引,索引從 0 開始計數。通過該屬性可以獲取當前選中行的位置,也可以設置選中某一行。 | int | 讀寫 | 取值范圍為 -1 到 count - 1 ,-1 表示沒有選中任何行。 |
count | 指示 QListWidget 中一共存在的行數,也就是列表項的數量。可以使用該屬性獲取列表的大小。 | int | 只讀 | 大于等于 0 的整數 |
sortingEnabled | 決定是否允許對列表中的項進行排序。當設置為 true 時,用戶可以通過某些操作(如點擊表頭)對列表項進行排序;設置為 false 時,列表項保持添加時的順序。 | bool | 讀寫 | true 或 false |
isWrapping | 用于設置列表項是否允許換行顯示。若設置為 true ,當列表項的內容過長時,會自動換行顯示;設置為 false 時,內容會以單行顯示,超出部分可能會被截斷。 | bool | 讀寫 | true 或 false |
itemAlignment | 定義列表項中文本或元素的對齊方式,例如左對齊、右對齊、居中對齊等。可以根據需要調整列表項內容的顯示位置。 | Qt::Alignment | 讀寫 | 常見取值如 Qt::AlignLeft 、Qt::AlignRight 、Qt::AlignCenter 等 |
selectRectVisible | 控制被選中的元素的矩形邊框是否可見。設置為 true 時,選中的列表項會顯示一個矩形邊框以突出顯示;設置為 false 時,不顯示該邊框。 | bool | 讀寫 | true 或 false |
spacing | 指定列表中各個元素(列表項)之間的間隔大小。通過調整該屬性,可以改變列表項之間的間距,從而影響列表的布局和外觀。 | int | 讀寫 | 大于等于0的整數 |
方法
方法 | 方法原型 | 說明 | 參數 | 返回值 |
---|---|---|---|---|
addItem | void addItem(const QString &label) void addItem(QListWidgetItem *item) | 向列表中添加元素。第一個重載方法接受一個字符串作為元素的文本標簽;第二個重載方法接受一個 QListWidgetItem 對象指針,可以自定義元素的屬性(如圖標、字體等)。 | 1. const QString &label :要添加元素的文本標簽。 2. QListWidgetItem *item :要添加的 QListWidgetItem 對象指針。 | void |
currentItem | QListWidgetItem *currentItem() const | 返回當前選中的元素。返回的是一個 QListWidgetItem 對象指針,可以通過該指針訪問和修改選中元素的屬性。 | 無 | QListWidgetItem * :當前選中的元素指針,若沒有選中元素則返回 nullptr 。 |
setCurrentItem | void setCurrentItem(QListWidgetItem *item) | 設置選中哪個元素。將指定的 QListWidgetItem 對象設置為當前選中元素。 | QListWidgetItem *item :要設置為選中狀態的元素指針。 | void |
setCurrentRow | void setCurrentRow(int row) | 設置選中第幾行的元素。通過行索引來指定要選中的元素。 | int row :要選中元素的行索引,索引從 0 開始。 | void |
insertItem | void insertItem(int row, const QString &label) void insertItem(int row, QListWidgetItem *item) | 在指定的位置插入元素。第一個重載方法接受一個行索引和一個字符串標簽,將帶有該標簽的元素插入到指定行;第二個重載方法接受一個行索引和一個 QListWidgetItem 對象指針,將該對象插入到指定行。 | 1. int row :要插入元素的行索引。 2. const QString &label :要插入元素的文本標簽。 3. QListWidgetItem *item :要插入的 QListWidgetItem 對象指針。 | void |
item | QListWidgetItem *item(int row) const | 返回指定行的元素。通過行索引獲取對應行的 QListWidgetItem 對象指針。 | int row :要獲取元素的行索引,索引從 0 開始。 | QListWidgetItem * :指定行的元素指針,若行索引超出范圍則返回 nullptr 。 |
takeItem | QListWidgetItem *takeItem(int row) | 刪除指定行的元素,并返回被刪除的元素指針。刪除后,該元素不再屬于 QListWidget ,但指針仍然有效,需要手動管理其內存。 | int row :要刪除元素的行索引,索引從 0 開始。 | QListWidgetItem * :被刪除的元素指針,若行索引超出范圍則返回 nullptr 。 |
1.2 常用信號
信號 | 信號原型 | 說明 | 參數 |
---|---|---|---|
currentItemChanged | void currentItemChanged(QListWidgetItem *current, QListWidgetItem *old) | 當選中的元素發生改變時觸發該信號。可用于在用戶切換選中元素時執行相應的操作,比如更新其他界面元素顯示選中元素的詳細信息等。 | 1. QListWidgetItem *current :當前新選中的元素指針。 2. QListWidgetItem *old :之前被選中的元素指針。 |
currentRowChanged | void currentRowChanged(int currentRow) | 同樣在選中的元素改變時觸發,不過此信號傳遞的是當前選中元素所在的行號。適用于根據行號進行一些邏輯處理的場景。 | int currentRow :當前選中元素的行號,行號從 0 開始計數。 |
itemClicked | void itemClicked(QListWidgetItem *item) | 當用戶點擊列表中的某個元素時觸發該信號。常用于實現點擊元素后的特定操作,如打開一個新窗口顯示元素詳情等。 | QListWidgetItem *item :被點擊的元素指針。 |
itemDoubleClicked | void itemDoubleClicked(QListWidgetItem *item) | 當用戶雙擊列表中的某個元素時觸發該信號。常見應用場景是通過雙擊元素執行一些更深入的操作,例如打開文件等。 | QListWidgetItem *item :被雙擊的元素指針。 |
itemEntered | void itemEntered(QListWidgetItem *item) | 當鼠標指針進入列表中的某個元素區域時觸發該信號。可用于實現鼠標懸停效果,如改變元素的顯示樣式等。 | QListWidgetItem *item :鼠標進入的元素指針。 |
##1.3 QListWidgetItem
這個類表示QListWidget
的一個元素。下面是常用方法
方法 | 方法原型 | 說明 | 參數 | 返回值 |
---|---|---|---|---|
setFont | void setFont(const QFont &font) | 用于設置列表項的字體樣式,包括字體的類型、大小、加粗、傾斜等屬性。 | const QFont &font :一個 QFont 對象,包含了要設置的字體信息。 | void |
setIcon | void setIcon(const QIcon &icon) | 為列表項設置圖標,圖標會顯示在列表項文本的旁邊,增強列表項的可視化效果。 | const QIcon &icon :一個 QIcon 對象,代表要設置的圖標。 | void |
setHidden | void setHidden(bool hide) | 控制列表項是否隱藏。當設置為 true 時,列表項將不可見;設置為 false 時,列表項正常顯示。 | bool hide :true 表示隱藏列表項,false 表示顯示列表項。 | void |
setSizeHint | void setSizeHint(const QSize &size) | 設置列表項的推薦尺寸,列表項會盡量按照指定的尺寸進行顯示。這在需要自定義列表項大小的場景中很有用。 | const QSize &size :一個 QSize 對象,包含了列表項的寬度和高度信息。 | void |
setSelected | void setSelected(bool select) | 設置列表項是否處于選中狀態。當設置為 true 時,列表項會被選中;設置為 false 時,列表項會取消選中狀態。 | bool select :true 表示選中列表項,false 表示取消選中。 | void |
setText | void setText(const QString &text) | 用于設置列表項顯示的文本內容。 | const QString &text :要設置的文本字符串。 | void |
setTextAlignment | void setTextAlignment(int alignment) | 設置列表項中文本的對齊方式,例如左對齊、右對齊、居中對齊等。 | int alignment :對齊方式的標志,可以使用 Qt::Alignment 枚舉值,如 Qt::AlignLeft 、Qt::AlignRight 、Qt::AlignCenter 等。 | void |
1.4 例子1,操作元素
在Qt Designer
中設置基本框架
給兩個按鈕添加槽函數
void Widget::on_pushButton_add_clicked()
{QString text = ui->lineEdit->text();if(text == "" || text.size() == 0) {qDebug() << "Empty...";return;} else {ui->listWidget->addItem(text);}
}void Widget::on_pushButton_del_clicked()
{int row = ui->listWidget->currentRow();if(row == -1) {qDebug() << "Not even one row selected";return;} else {ui->listWidget->takeItem(row);}
}
運行結果如下
2. QTableWidget
QTableWidget
表示表格控件
2.1 常用屬性和方法
屬性具體見1.1
。有兩個獨有的屬性columnCount
和rowCount
,分別表示表格列數和行數
下面是常用方法
方法 | 方法原型 | 說明 | 參數 | 返回值 |
---|---|---|---|---|
item | QTableWidgetItem *item(int row, int column) const | 根據指定的行和列獲取表格中對應位置的 QTableWidgetItem 指針。若該位置沒有元素,則返回 nullptr 。 | int row :行索引,從 0 開始計數。 int column :列索引,從 0 開始計數。 | QTableWidgetItem * :指定位置的 QTableWidgetItem 指針,若無則為 nullptr 。 |
setItem | void setItem(int row, int column, QTableWidgetItem *item) | 在指定的行和列位置設置一個 QTableWidgetItem 元素。若該位置已有元素,會被新元素替換。 | int row :行索引,從 0 開始計數。 int column :列索引,從 0 開始計數。 QTableWidgetItem *item :要設置的 QTableWidgetItem 指針。 | void |
currentItem | QTableWidgetItem *currentItem() const | 返回當前被選中的 QTableWidgetItem 元素的指針。若沒有選中元素,則返回 nullptr 。 | 無 | QTableWidgetItem * :當前選中元素的指針,若無則為 nullptr 。 |
currentRow | int currentRow() const | 返回當前被選中元素所在的行號。若沒有選中元素,則返回 -1。 | 無 | int :當前選中元素的行號,若無選中元素則為 -1。 |
currentColumn | int currentColumn() const | 返回當前被選中元素所在的列號。若沒有選中元素,則返回 -1。 | 無 | int :當前選中元素的列號,若無選中元素則為 -1。 |
row | int row(const QTableWidgetItem *item) const | 獲取指定 QTableWidgetItem 元素所在的行號。若該元素不在表格中,則返回 -1。 | const QTableWidgetItem *item :要查詢的 QTableWidgetItem 指針。 | int :指定元素所在的行號,若元素不在表格中則為 -1。 |
column | int column(const QTableWidgetItem *item) const | 獲取指定 QTableWidgetItem 元素所在的列號。若該元素不在表格中,則返回 -1。 | const QTableWidgetItem *item :要查詢的 QTableWidgetItem 指針。 | int :指定元素所在的列號,若元素不在表格中則為 -1。 |
rowCount | int rowCount() const | 獲取表格的行數。 | 無 | int :表格的行數。 |
columnCount | int columnCount() const | 獲取表格的列數。 | 無 | int :表格的列數。 |
insertRow | void insertRow(int row) | 在指定的行位置插入一個新行。原來位于該行及以下的行都會向下移動一行。 | int row :要插入新行的行索引,從 0 開始計數。 | void |
insertColumn | void insertColumn(int column) | 在指定的列位置插入一個新列。原來位于該列及以后的列都會向右移動一列。 | int column :要插入新列的列索引,從 0 開始計數。 | void |
removeRow | void removeRow(int row) | 刪除指定行的所有元素,并將該行從表格中移除。原來位于該行以下的行都會向上移動一行。 | int row :要刪除的行索引,從 0 開始計數。 | void |
removeColumn | void removeColumn(int column) | 刪除指定列的所有元素,并將該列從表格中移除。原來位于該列以后的列都會向左移動一列。 | int column :要刪除的列索引,從 0 開始計數。 | void |
setHorizontalHeaderItem | void setHorizontalHeaderItem(int column, QTableWidgetItem *item) | 設置指定列的水平表頭元素。 | int column :要設置表頭的列索引,從 0 開始計數。 QTableWidgetItem *item :用于作為表頭的 QTableWidgetItem 指針。 | void |
setVerticalHeaderItem | void setVerticalHeaderItem(int row, QTableWidgetItem *item) | 設置指定行的垂直表頭元素。 | int row :要設置表頭的行索引,從 0 開始計數。 QTableWidgetItem *item :用于作為表頭的 QTableWidgetItem 指針。 | void |
QTableWidgetItem
屬性與上面類似
2.2 常用信號
信號 | 信號原型 | 說明 | 參數 |
---|---|---|---|
cellClicked | void cellClicked(int row, int column) | 當用戶點擊表格中的某個單元格時,會觸發該信號。常用于在用戶點擊單元格后執行相應的操作,比如顯示單元格詳細信息、進行數據編輯等。 | int row :被點擊單元格所在的行號,行號從 0 開始計數。 int column :被點擊單元格所在的列號,列號從 0 開始計數。 |
cellDoubleClicked | void cellDoubleClicked(int row, int column) | 當用戶雙擊表格中的某個單元格時,此信號會被觸發。通常用于實現一些需要雙擊操作激活的功能,例如打開一個新窗口展示單元格關聯的數據等。 | int row :被雙擊單元格所在的行號,行號從 0 開始計數。 int column :被雙擊單元格所在的列號,列號從 0 開始計數。 |
cellEntered | void cellEntered(int row, int column) | 當鼠標指針進入表格中的某個單元格區域時,會觸發該信號。可用于實現鼠標懸停效果,如改變單元格的背景顏色、顯示提示信息等。 | int row :鼠標進入單元格所在的行號,行號從 0 開始計數。 int column :鼠標進入單元格所在的列號,列號從 0 開始計數。 |
currentCellChanged | void currentCellChanged(int row, int column, int previousRow, int previousColumn) | 當選中的單元格發生變化時,該信號會被觸發。參數中包含了當前選中單元格的行號和列號,以及之前選中單元格的行號和列號。可用于跟蹤用戶選擇單元格的操作,更新相關的界面顯示或執行特定的邏輯處理。 | int row :當前選中單元格所在的行號,行號從 0 開始計數。 int column :當前選中單元格所在的列號,列號從 0 開始計數。 int previousRow :之前選中單元格所在的行號,行號從 0 開始計數。 int previousColumn :之前選中單元格所在的列號,列號從 0 開始計數。 |
2.3 例子1,創建表格
在Qt Designer
中設置基本框架
widget.cpp
如下
#include "widget.h"
#include <QDebug>
#include "ui_widget.h"Widget::Widget(QWidget* parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);const static int N = 3;for (int i = 0; i < N; ++i) {// 建行和建列ui->tableWidget->insertRow(i);ui->tableWidget->insertColumn(i);}// 設置列名ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("學號"));ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("姓名"));ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("電話"));// 設置初始值, 第0行ui->tableWidget->setItem(0, 0, new QTableWidgetItem("20241001"));ui->tableWidget->setItem(0, 1, new QTableWidgetItem("小A"));ui->tableWidget->setItem(0, 2, new QTableWidgetItem("1561111000"));// 第1行ui->tableWidget->setItem(1, 0, new QTableWidgetItem("20241002")); // 第1行,第0列ui->tableWidget->setItem(1, 1, new QTableWidgetItem("小B")); // 第1行,第1列ui->tableWidget->setItem(1, 2, new QTableWidgetItem("1561111001")); // 第1行,第2列// 第2行ui->tableWidget->setItem(2, 0, new QTableWidgetItem("20241003")); // 第2行,第0列ui->tableWidget->setItem(2, 1, new QTableWidgetItem("小C")); // 第2行,第1列ui->tableWidget->setItem(2, 2, new QTableWidgetItem("1561111002")); // 第2行,第2列
}Widget::~Widget()
{delete ui;
}void Widget::on_add_row_btn_clicked()
{int rowCount = ui->tableWidget->rowCount();ui->tableWidget->insertRow(rowCount);
}void Widget::on_del_row_btn_clicked()
{int curRow = ui->tableWidget->currentRow();if (curRow == -1) {qDebug() << "Row not even exist...";return;}ui->tableWidget->removeRow(curRow);
}void Widget::on_add_col_btn_clicked()
{QString text = ui->lineEdit->text();if (text.isEmpty()) {qDebug() << "LineEdit text empty...";return;}int colCount = ui->tableWidget->columnCount();ui->tableWidget->insertColumn(colCount);ui->tableWidget->setHorizontalHeaderItem(colCount, new QTableWidgetItem(text));
}void Widget::on_del_col_btn_clicked()
{int curCol = ui->tableWidget->currentColumn();if (curCol == -1) {qDebug() << "Column not even exist...";return;}ui->tableWidget->removeColumn(curCol);
}
運行結果如下
#3. QTreeWidget
QTreeWidget
表示一個樹形控件,每個元素都是一個QTreeWidgetItem
,每個QTreeWidgetItem
可以包含多個文本和圖片。
注意:QTreeWidget
雖然是樹形結構,但是這個樹形結構并沒有體現出根節點,而是從根節點的下一層開始計算的。該層節點就叫做頂層節點(TopLevelItem)。
3.1 常用屬性和方法
方法 | 方法原型 | 說明 | 參數 | 返回值 |
---|---|---|---|---|
clear | void clear() | 清空 QTreeWidget 中的所有子節點,包括頂層節點及其子節點,將樹狀結構恢復為空狀態。 | 無 | void |
addTopLevelItem | void addTopLevelItem(QTreeWidgetItem *item) | 向 QTreeWidget 中新增一個頂層節點。頂層節點是樹狀結構中最上層的節點。 | QTreeWidgetItem *item :要添加的頂層節點指針 | void |
topLevelItem | QTreeWidgetItem *topLevelItem(int index) const | 根據指定的下標獲取對應的頂層節點。 | int index :頂層節點的下標,從 0 開始計數 | QTreeWidgetItem * :指定下標的頂層節點指針,如果下標超出范圍則返回 nullptr |
topLevelItemCount | int topLevelItemCount() const | 獲取 QTreeWidget 中頂層節點的個數。 | 無 | int :頂層節點的數量 |
indexOfTopLevelItem | int indexOfTopLevelItem(QTreeWidgetItem *item) const | 查詢指定的節點在頂層節點中的下標。 | QTreeWidgetItem *item :要查詢的節點指針 | int :指定節點在頂層節點中的下標,如果該節點不是頂層節點則返回 -1 |
takeTopLevelItem | QTreeWidgetItem *takeTopLevelItem(int index) | 刪除指定下標的頂層節點,并返回被刪除的節點指針。調用該方法后,被刪除的節點不再屬于 QTreeWidget ,需要手動管理其內存。 | int index :要刪除的頂層節點的下標,從 0 開始計數 | QTreeWidgetItem * :被刪除的頂層節點指針,如果下標超出范圍則返回 nullptr |
currentItem | QTreeWidgetItem *currentItem() const | 獲取當前被選中的節點。 | 無 | QTreeWidgetItem * :當前選中的節點指針,如果沒有選中節點則返回 nullptr |
setCurrentItem | void setCurrentItem(QTreeWidgetItem *item) | 將指定的節點設置為當前選中節點。 | QTreeWidgetItem *item :要設置為選中狀態的節點指針 | void |
setExpanded | void setExpanded(bool expanded) | 展開或關閉 QTreeWidget 中的所有節點。當參數為 true 時,所有節點展開;當參數為 false 時,所有節點關閉。 | bool expanded :true 表示展開節點,false 表示關閉節點 | void |
setHeaderLabel | void setHeaderLabel(const QString &text) | 設置 QTreeWidget 的表頭標簽文本。表頭位于樹狀結構的頂部,用于標識各列的含義。 | const QString &text :要設置的表頭標簽文本 | void |
下面是QTreeWidgetItem
的部分方法
方法 | 方法原型 | 說明 | 參數 | 返回值 |
---|---|---|---|---|
addChild | void addChild(QTreeWidgetItem *child) | 為當前 QTreeWidgetItem 新增一個子節點。新增的子節點會顯示在當前節點的下一級。 | QTreeWidgetItem *child :要添加的子節點指針 | void |
childCount | int childCount() const | 獲取當前 QTreeWidgetItem 的子節點個數。可用于判斷當前節點下是否有子節點以及子節點的數量。 | 無 | int :子節點的數量 |
child | QTreeWidgetItem *child(int index) const | 根據指定的下標獲取當前 QTreeWidgetItem 的子節點。 | int index :子節點的下標,從 0 開始計數 | QTreeWidgetItem * :指定下標的子節點指針,如果下標超出范圍則返回 nullptr |
takeChild | QTreeWidgetItem *takeChild(int index) | 刪除當前 QTreeWidgetItem 對應下標的子節點,并返回被刪除的子節點指針。調用該方法后,被刪除的子節點不再屬于當前節點,需要手動管理其內存。 | int index :要刪除的子節點的下標,從 0 開始計數 | QTreeWidgetItem * :被刪除的子節點指針,如果下標超出范圍則返回 nullptr |
removeChild | void removeChild(QTreeWidgetItem *child) | 從當前 QTreeWidgetItem 中刪除指定的子節點。與 takeChild 不同,該方法不返回被刪除的子節點指針。 | QTreeWidgetItem *child :要刪除的子節點指針 | void |
parent | QTreeWidgetItem *parent() const | 獲取當前 QTreeWidgetItem 的父節點。如果當前節點是頂層節點,則返回 nullptr 。 | 無 | QTreeWidgetItem * :父節點的指針,如果沒有父節點則返回 nullptr |
3.2 常用信號
信號 | 信號原型 | 說明 | 參數 |
---|---|---|---|
currentItemChanged | void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *old) | 當 QTreeWidget 中選中的元素發生切換時,該信號會被觸發。可用于在用戶改變選中節點時執行相應的操作,比如更新界面上顯示的節點詳細信息等。 | 1. QTreeWidgetItem *current :當前新選中的節點指針。 2. QTreeWidgetItem *old :之前被選中的節點指針。 |
itemClicked | void itemClicked(QTreeWidgetItem *item, int col) | 當用戶點擊 QTreeWidget 中的某個元素時,此信號會被觸發。常用于實現點擊節點后的特定功能,例如展開子節點、顯示關聯數據等。 | 1. QTreeWidgetItem *item :被點擊的節點指針。 2. int col :被點擊節點所在的列索引,列索引從 0 開始計數。 |
itemDoubleClicked | void itemDoubleClicked(QTreeWidgetItem *item, int col) | 當用戶雙擊 QTreeWidget 中的某個元素時,該信號會被觸發。通常用于執行一些需要雙擊操作激活的功能,比如打開一個新窗口展示節點的詳細內容等。 | 1. QTreeWidgetItem *item :被雙擊的節點指針。 2. int col :被雙擊節點所在的列索引,列索引從 0 開始計數。 |
itemEntered | void itemEntered(QTreeWidgetItem *item, int col) | 當鼠標指針進入 QTreeWidget 中的某個元素區域時,該信號會被觸發。可用于實現鼠標懸停效果,如改變節點的顯示樣式、顯示提示信息等。 | 1. QTreeWidgetItem *item :鼠標進入的節點指針。 2. int col :鼠標進入節點所在的列索引,列索引從 0 開始計數。 |
itemExpanded | void itemExpanded(QTreeWidgetItem *item) | 當 QTreeWidget 中的某個元素被展開時,該信號會被觸發。可用于在節點展開時執行一些額外的操作,比如加載子節點的數據等。 | QTreeWidgetItem *item :被展開的節點指針。 |
itemCollapsed | void itemCollapsed(QTreeWidgetItem *item) | 當 QTreeWidget 中的某個元素被折疊時,該信號會被觸發。可用于在節點折疊時執行一些清理操作,比如釋放子節點占用的資源等。 | QTreeWidgetItem *item :被折疊的節點指針。 |
3.3 例子1,創建樹形結構
在Qt Designer
中設置基本框架
widget.cpp
如下
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget* parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 設置列數ui->treeWidget->setColumnCount(2);// 設置表頭標簽文本ui->treeWidget->setHeaderLabels(QStringList() << "名稱" << "english");// 添加頂層節點addTopLevelItemWithText(0, "姓名");addTopLevelItemWithText(0, "電話");addTopLevelItemWithText(1, "name");addTopLevelItemWithText(1, "phone");
}Widget::~Widget()
{delete ui;
}// 輔助函數, 添加頂層節點并設置文本
void Widget::addTopLevelItemWithText(int column, const QString &text)
{QTreeWidgetItem* item = new QTreeWidgetItem();item->setText(column, text);ui->treeWidget->addTopLevelItem(item);
}void Widget::on_addToTop_clicked()
{QString text = ui->lineEdit->text();if(text.isEmpty()) {return;}addTopLevelItemWithText(0, text);addTopLevelItemWithText(1, text + "abc"); // 這里可以加個哈希表
}void Widget::on_addToSelect_clicked()
{QString text = ui->lineEdit->text();if(text.isEmpty()) {return;}QTreeWidgetItem* cur = ui->treeWidget->currentItem();if(cur == nullptr) {return;}QTreeWidgetItem* item = new QTreeWidgetItem();item->setText(cur->columnCount()-1, text);cur->addChild(item);
}void Widget::on_removeSelect_clicked()
{auto cur = ui->treeWidget->currentItem();if(cur == nullptr) {return;}auto parent = cur->parent();if(parent != nullptr) {// 不是頂層節點parent->removeChild(cur);delete cur;} else {// 是頂層節點int index = ui->treeWidget->indexOfTopLevelItem(cur); // 獲取下標ui->treeWidget->takeTopLevelItem(index);}
}
運行結果如下