Qt常用控件 多元素控件

文章目錄

  • 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

xxWidgetxxView之間的區別:

  • 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讀寫truefalse
isWrapping用于設置列表項是否允許換行顯示。若設置為 true,當列表項的內容過長時,會自動換行顯示;設置為 false 時,內容會以單行顯示,超出部分可能會被截斷。bool讀寫truefalse
itemAlignment定義列表項中文本或元素的對齊方式,例如左對齊、右對齊、居中對齊等。可以根據需要調整列表項內容的顯示位置。Qt::Alignment讀寫常見取值如 Qt::AlignLeftQt::AlignRightQt::AlignCenter
selectRectVisible控制被選中的元素的矩形邊框是否可見。設置為 true 時,選中的列表項會顯示一個矩形邊框以突出顯示;設置為 false 時,不顯示該邊框。bool讀寫truefalse
spacing指定列表中各個元素(列表項)之間的間隔大小。通過調整該屬性,可以改變列表項之間的間距,從而影響列表的布局和外觀。int讀寫大于等于0的整數

方法

方法方法原型說明參數返回值
addItemvoid addItem(const QString &label) void addItem(QListWidgetItem *item)向列表中添加元素。第一個重載方法接受一個字符串作為元素的文本標簽;第二個重載方法接受一個 QListWidgetItem 對象指針,可以自定義元素的屬性(如圖標、字體等)。1. const QString &label:要添加元素的文本標簽。 2. QListWidgetItem *item:要添加的 QListWidgetItem 對象指針。void
currentItemQListWidgetItem *currentItem() const返回當前選中的元素。返回的是一個 QListWidgetItem 對象指針,可以通過該指針訪問和修改選中元素的屬性。QListWidgetItem *:當前選中的元素指針,若沒有選中元素則返回 nullptr
setCurrentItemvoid setCurrentItem(QListWidgetItem *item)設置選中哪個元素。將指定的 QListWidgetItem 對象設置為當前選中元素。QListWidgetItem *item:要設置為選中狀態的元素指針。void
setCurrentRowvoid setCurrentRow(int row)設置選中第幾行的元素。通過行索引來指定要選中的元素。int row:要選中元素的行索引,索引從 0 開始。void
insertItemvoid 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
itemQListWidgetItem *item(int row) const返回指定行的元素。通過行索引獲取對應行的 QListWidgetItem 對象指針。int row:要獲取元素的行索引,索引從 0 開始。QListWidgetItem *:指定行的元素指針,若行索引超出范圍則返回 nullptr
takeItemQListWidgetItem *takeItem(int row)刪除指定行的元素,并返回被刪除的元素指針。刪除后,該元素不再屬于 QListWidget,但指針仍然有效,需要手動管理其內存。int row:要刪除元素的行索引,索引從 0 開始。QListWidgetItem *:被刪除的元素指針,若行索引超出范圍則返回 nullptr

1.2 常用信號

信號信號原型說明參數
currentItemChangedvoid currentItemChanged(QListWidgetItem *current, QListWidgetItem *old)當選中的元素發生改變時觸發該信號。可用于在用戶切換選中元素時執行相應的操作,比如更新其他界面元素顯示選中元素的詳細信息等。1. QListWidgetItem *current:當前新選中的元素指針。 2. QListWidgetItem *old:之前被選中的元素指針。
currentRowChangedvoid currentRowChanged(int currentRow)同樣在選中的元素改變時觸發,不過此信號傳遞的是當前選中元素所在的行號。適用于根據行號進行一些邏輯處理的場景。int currentRow:當前選中元素的行號,行號從 0 開始計數。
itemClickedvoid itemClicked(QListWidgetItem *item)當用戶點擊列表中的某個元素時觸發該信號。常用于實現點擊元素后的特定操作,如打開一個新窗口顯示元素詳情等。QListWidgetItem *item:被點擊的元素指針。
itemDoubleClickedvoid itemDoubleClicked(QListWidgetItem *item)當用戶雙擊列表中的某個元素時觸發該信號。常見應用場景是通過雙擊元素執行一些更深入的操作,例如打開文件等。QListWidgetItem *item:被雙擊的元素指針。
itemEnteredvoid itemEntered(QListWidgetItem *item)當鼠標指針進入列表中的某個元素區域時觸發該信號。可用于實現鼠標懸停效果,如改變元素的顯示樣式等。QListWidgetItem *item:鼠標進入的元素指針。

##1.3 QListWidgetItem

這個類表示QListWidget的一個元素。下面是常用方法

方法方法原型說明參數返回值
setFontvoid setFont(const QFont &font)用于設置列表項的字體樣式,包括字體的類型、大小、加粗、傾斜等屬性。const QFont &font:一個 QFont 對象,包含了要設置的字體信息。void
setIconvoid setIcon(const QIcon &icon)為列表項設置圖標,圖標會顯示在列表項文本的旁邊,增強列表項的可視化效果。const QIcon &icon:一個 QIcon 對象,代表要設置的圖標。void
setHiddenvoid setHidden(bool hide)控制列表項是否隱藏。當設置為 true 時,列表項將不可見;設置為 false 時,列表項正常顯示。bool hidetrue 表示隱藏列表項,false 表示顯示列表項。void
setSizeHintvoid setSizeHint(const QSize &size)設置列表項的推薦尺寸,列表項會盡量按照指定的尺寸進行顯示。這在需要自定義列表項大小的場景中很有用。const QSize &size:一個 QSize 對象,包含了列表項的寬度和高度信息。void
setSelectedvoid setSelected(bool select)設置列表項是否處于選中狀態。當設置為 true 時,列表項會被選中;設置為 false 時,列表項會取消選中狀態。bool selecttrue 表示選中列表項,false 表示取消選中。void
setTextvoid setText(const QString &text)用于設置列表項顯示的文本內容。const QString &text:要設置的文本字符串。void
setTextAlignmentvoid setTextAlignment(int alignment)設置列表項中文本的對齊方式,例如左對齊、右對齊、居中對齊等。int alignment:對齊方式的標志,可以使用 Qt::Alignment 枚舉值,如 Qt::AlignLeftQt::AlignRightQt::AlignCenter 等。void

1.4 例子1,操作元素

Qt Designer中設置基本框架

image-20250201163932343

給兩個按鈕添加槽函數

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

運行結果如下

image-20250201164004846

2. QTableWidget

QTableWidget表示表格控件

2.1 常用屬性和方法

屬性具體見1.1。有兩個獨有的屬性columnCountrowCount,分別表示表格列數和行數

下面是常用方法

方法方法原型說明參數返回值
itemQTableWidgetItem *item(int row, int column) const根據指定的行和列獲取表格中對應位置的 QTableWidgetItem 指針。若該位置沒有元素,則返回 nullptrint row:行索引,從 0 開始計數。 int column:列索引,從 0 開始計數。QTableWidgetItem *:指定位置的 QTableWidgetItem 指針,若無則為 nullptr
setItemvoid setItem(int row, int column, QTableWidgetItem *item)在指定的行和列位置設置一個 QTableWidgetItem 元素。若該位置已有元素,會被新元素替換。int row:行索引,從 0 開始計數。 int column:列索引,從 0 開始計數。 QTableWidgetItem *item:要設置的 QTableWidgetItem 指針。void
currentItemQTableWidgetItem *currentItem() const返回當前被選中的 QTableWidgetItem 元素的指針。若沒有選中元素,則返回 nullptrQTableWidgetItem *:當前選中元素的指針,若無則為 nullptr
currentRowint currentRow() const返回當前被選中元素所在的行號。若沒有選中元素,則返回 -1。int:當前選中元素的行號,若無選中元素則為 -1。
currentColumnint currentColumn() const返回當前被選中元素所在的列號。若沒有選中元素,則返回 -1。int:當前選中元素的列號,若無選中元素則為 -1。
rowint row(const QTableWidgetItem *item) const獲取指定 QTableWidgetItem 元素所在的行號。若該元素不在表格中,則返回 -1。const QTableWidgetItem *item:要查詢的 QTableWidgetItem 指針。int:指定元素所在的行號,若元素不在表格中則為 -1。
columnint column(const QTableWidgetItem *item) const獲取指定 QTableWidgetItem 元素所在的列號。若該元素不在表格中,則返回 -1。const QTableWidgetItem *item:要查詢的 QTableWidgetItem 指針。int:指定元素所在的列號,若元素不在表格中則為 -1。
rowCountint rowCount() const獲取表格的行數。int:表格的行數。
columnCountint columnCount() const獲取表格的列數。int:表格的列數。
insertRowvoid insertRow(int row)在指定的行位置插入一個新行。原來位于該行及以下的行都會向下移動一行。int row:要插入新行的行索引,從 0 開始計數。void
insertColumnvoid insertColumn(int column)在指定的列位置插入一個新列。原來位于該列及以后的列都會向右移動一列。int column:要插入新列的列索引,從 0 開始計數。void
removeRowvoid removeRow(int row)刪除指定行的所有元素,并將該行從表格中移除。原來位于該行以下的行都會向上移動一行。int row:要刪除的行索引,從 0 開始計數。void
removeColumnvoid removeColumn(int column)刪除指定列的所有元素,并將該列從表格中移除。原來位于該列以后的列都會向左移動一列。int column:要刪除的列索引,從 0 開始計數。void
setHorizontalHeaderItemvoid setHorizontalHeaderItem(int column, QTableWidgetItem *item)設置指定列的水平表頭元素。int column:要設置表頭的列索引,從 0 開始計數。 QTableWidgetItem *item:用于作為表頭的 QTableWidgetItem 指針。void
setVerticalHeaderItemvoid setVerticalHeaderItem(int row, QTableWidgetItem *item)設置指定行的垂直表頭元素。int row:要設置表頭的行索引,從 0 開始計數。 QTableWidgetItem *item:用于作為表頭的 QTableWidgetItem 指針。void

QTableWidgetItem屬性與上面類似

2.2 常用信號

信號信號原型說明參數
cellClickedvoid cellClicked(int row, int column)當用戶點擊表格中的某個單元格時,會觸發該信號。常用于在用戶點擊單元格后執行相應的操作,比如顯示單元格詳細信息、進行數據編輯等。int row:被點擊單元格所在的行號,行號從 0 開始計數。 int column:被點擊單元格所在的列號,列號從 0 開始計數。
cellDoubleClickedvoid cellDoubleClicked(int row, int column)當用戶雙擊表格中的某個單元格時,此信號會被觸發。通常用于實現一些需要雙擊操作激活的功能,例如打開一個新窗口展示單元格關聯的數據等。int row:被雙擊單元格所在的行號,行號從 0 開始計數。 int column:被雙擊單元格所在的列號,列號從 0 開始計數。
cellEnteredvoid cellEntered(int row, int column)當鼠標指針進入表格中的某個單元格區域時,會觸發該信號。可用于實現鼠標懸停效果,如改變單元格的背景顏色、顯示提示信息等。int row:鼠標進入單元格所在的行號,行號從 0 開始計數。 int column:鼠標進入單元格所在的列號,列號從 0 開始計數。
currentCellChangedvoid 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中設置基本框架

image-20250202130703024

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

運行結果如下

image-20250202130635672

#3. QTreeWidget

QTreeWidget表示一個樹形控件,每個元素都是一個QTreeWidgetItem,每個QTreeWidgetItem可以包含多個文本和圖片。

注意QTreeWidget雖然是樹形結構,但是這個樹形結構并沒有體現出根節點,而是從根節點的下一層開始計算的。該層節點就叫做頂層節點(TopLevelItem)。

3.1 常用屬性和方法

方法方法原型說明參數返回值
clearvoid clear()清空 QTreeWidget 中的所有子節點,包括頂層節點及其子節點,將樹狀結構恢復為空狀態。void
addTopLevelItemvoid addTopLevelItem(QTreeWidgetItem *item)QTreeWidget 中新增一個頂層節點。頂層節點是樹狀結構中最上層的節點。QTreeWidgetItem *item:要添加的頂層節點指針void
topLevelItemQTreeWidgetItem *topLevelItem(int index) const根據指定的下標獲取對應的頂層節點。int index:頂層節點的下標,從 0 開始計數QTreeWidgetItem *:指定下標的頂層節點指針,如果下標超出范圍則返回 nullptr
topLevelItemCountint topLevelItemCount() const獲取 QTreeWidget 中頂層節點的個數。int:頂層節點的數量
indexOfTopLevelItemint indexOfTopLevelItem(QTreeWidgetItem *item) const查詢指定的節點在頂層節點中的下標。QTreeWidgetItem *item:要查詢的節點指針int:指定節點在頂層節點中的下標,如果該節點不是頂層節點則返回 -1
takeTopLevelItemQTreeWidgetItem *takeTopLevelItem(int index)刪除指定下標的頂層節點,并返回被刪除的節點指針。調用該方法后,被刪除的節點不再屬于 QTreeWidget,需要手動管理其內存。int index:要刪除的頂層節點的下標,從 0 開始計數QTreeWidgetItem *:被刪除的頂層節點指針,如果下標超出范圍則返回 nullptr
currentItemQTreeWidgetItem *currentItem() const獲取當前被選中的節點。QTreeWidgetItem *:當前選中的節點指針,如果沒有選中節點則返回 nullptr
setCurrentItemvoid setCurrentItem(QTreeWidgetItem *item)將指定的節點設置為當前選中節點。QTreeWidgetItem *item:要設置為選中狀態的節點指針void
setExpandedvoid setExpanded(bool expanded)展開或關閉 QTreeWidget 中的所有節點。當參數為 true 時,所有節點展開;當參數為 false 時,所有節點關閉。bool expandedtrue 表示展開節點,false 表示關閉節點void
setHeaderLabelvoid setHeaderLabel(const QString &text)設置 QTreeWidget 的表頭標簽文本。表頭位于樹狀結構的頂部,用于標識各列的含義。const QString &text:要設置的表頭標簽文本void

下面是QTreeWidgetItem的部分方法

方法方法原型說明參數返回值
addChildvoid addChild(QTreeWidgetItem *child)為當前 QTreeWidgetItem 新增一個子節點。新增的子節點會顯示在當前節點的下一級。QTreeWidgetItem *child:要添加的子節點指針void
childCountint childCount() const獲取當前 QTreeWidgetItem 的子節點個數。可用于判斷當前節點下是否有子節點以及子節點的數量。int:子節點的數量
childQTreeWidgetItem *child(int index) const根據指定的下標獲取當前 QTreeWidgetItem 的子節點。int index:子節點的下標,從 0 開始計數QTreeWidgetItem *:指定下標的子節點指針,如果下標超出范圍則返回 nullptr
takeChildQTreeWidgetItem *takeChild(int index)刪除當前 QTreeWidgetItem 對應下標的子節點,并返回被刪除的子節點指針。調用該方法后,被刪除的子節點不再屬于當前節點,需要手動管理其內存。int index:要刪除的子節點的下標,從 0 開始計數QTreeWidgetItem *:被刪除的子節點指針,如果下標超出范圍則返回 nullptr
removeChildvoid removeChild(QTreeWidgetItem *child)從當前 QTreeWidgetItem 中刪除指定的子節點。與 takeChild 不同,該方法不返回被刪除的子節點指針。QTreeWidgetItem *child:要刪除的子節點指針void
parentQTreeWidgetItem *parent() const獲取當前 QTreeWidgetItem 的父節點。如果當前節點是頂層節點,則返回 nullptrQTreeWidgetItem *:父節點的指針,如果沒有父節點則返回 nullptr

3.2 常用信號

信號信號原型說明參數
currentItemChangedvoid currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *old)QTreeWidget 中選中的元素發生切換時,該信號會被觸發。可用于在用戶改變選中節點時執行相應的操作,比如更新界面上顯示的節點詳細信息等。1. QTreeWidgetItem *current:當前新選中的節點指針。 2. QTreeWidgetItem *old:之前被選中的節點指針。
itemClickedvoid itemClicked(QTreeWidgetItem *item, int col)當用戶點擊 QTreeWidget 中的某個元素時,此信號會被觸發。常用于實現點擊節點后的特定功能,例如展開子節點、顯示關聯數據等。1. QTreeWidgetItem *item:被點擊的節點指針。 2. int col:被點擊節點所在的列索引,列索引從 0 開始計數。
itemDoubleClickedvoid itemDoubleClicked(QTreeWidgetItem *item, int col)當用戶雙擊 QTreeWidget 中的某個元素時,該信號會被觸發。通常用于執行一些需要雙擊操作激活的功能,比如打開一個新窗口展示節點的詳細內容等。1. QTreeWidgetItem *item:被雙擊的節點指針。 2. int col:被雙擊節點所在的列索引,列索引從 0 開始計數。
itemEnteredvoid itemEntered(QTreeWidgetItem *item, int col)當鼠標指針進入 QTreeWidget 中的某個元素區域時,該信號會被觸發。可用于實現鼠標懸停效果,如改變節點的顯示樣式、顯示提示信息等。1. QTreeWidgetItem *item:鼠標進入的節點指針。 2. int col:鼠標進入節點所在的列索引,列索引從 0 開始計數。
itemExpandedvoid itemExpanded(QTreeWidgetItem *item)QTreeWidget 中的某個元素被展開時,該信號會被觸發。可用于在節點展開時執行一些額外的操作,比如加載子節點的數據等。QTreeWidgetItem *item:被展開的節點指針。
itemCollapsedvoid itemCollapsed(QTreeWidgetItem *item)QTreeWidget 中的某個元素被折疊時,該信號會被觸發。可用于在節點折疊時執行一些清理操作,比如釋放子節點占用的資源等。QTreeWidgetItem *item:被折疊的節點指針。

3.3 例子1,創建樹形結構

Qt Designer中設置基本框架

image-20250203222814528

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

運行結果如下

image-20250203222739302

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/894613.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894613.shtml
英文地址,請注明出處:http://en.pswp.cn/news/894613.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2. 動態測試

一、動態測試是什么&#xff1f; 動態測試&#xff08;Dynamic Test&#xff09;允許在運行時生成測試用例&#xff0c;而不是在編譯時通過 Test 靜態定義。它通過 TestFactory 注解標記的方法動態生成一組測試用例&#xff0c;適用于需要靈活生成測試場景的場景。 核心特點&…

33.Word:國家中長期人才發展規劃綱要【33】

目錄 NO1.2樣式? NO3? 圖表 ? NO4.5.6? 開始→段落標記視圖→導航窗格→檢查有無遺漏 NO1.2樣式 F12/另存為&#xff1a;Word.docx&#xff1a;考生文件夾樣式的復制樣式的修改 樣式的應用&#xff08;沒有相似/超級多的情況下&#xff09;——替換 [ ]通配符&#x…

Qt展廳播放器/多媒體播放器/中控播放器/幀同步播放器/硬解播放器/監控播放器

一、前言說明 音視頻開發除了應用在安防監控、視頻網站、各種流媒體app開發之外&#xff0c;還有一個小眾的市場&#xff0c;那就是多媒體展廳場景&#xff0c;這個場景目前處于壟斷地位的軟件是HirenderS3&#xff0c;做的非常早而且非常全面&#xff0c;都是通用的需求&…

2021版小程序開發5——小程序項目開發實踐(1)

2021版小程序開發5——小程序項目開發實踐(1) 學習筆記 2025 使用uni-app開發一個電商項目&#xff1b; Hbuidler 首選uni-app官方推薦工具&#xff1a;https://www.dcloud.io/hbuilderx.htmlhttps://dev.dcloud.net.cn/pages/app/list 微信小程序 管理后臺&#xff1a;htt…

【零拷貝】

目錄 一&#xff1a;了解IO基礎概念 二&#xff1a;數據流動的層次結構 三&#xff1a;零拷貝 1.傳統IO文件讀寫 2.mmap 零拷貝技術 3.sendFile 零拷貝技術 一&#xff1a;了解IO基礎概念 理解CPU拷貝和DMA拷貝 ? 我們知道&#xff0c;操作系統對于內存空間&…

全棧開發:使用.NET Core WebAPI構建前后端分離的核心技巧(一)

目錄 cors解決跨域 依賴注入使用 分層服務注冊 緩存方法使用 內存緩存使用 緩存過期清理 緩存存在問題 分布式的緩存 cors解決跨域 前后端分離已經成為一種越來越流行的架構模式&#xff0c;由于跨域資源共享(cors)是瀏覽器的一種安全機制&#xff0c;它會阻止前端應用…

《Linux服務與安全管理》| 數據庫服務器安裝和配置

《Linux服務與安全管理》| 數據庫服務器安裝和配置 目錄 《Linux服務與安全管理》| 數據庫服務器安裝和配置 任務一&#xff1a; 安裝PostgreSQL數據庫&#xff0c;設置遠程登錄&#xff0c;客戶端可以成功登錄并操作數據庫。 任務二&#xff1a; 安裝MySQL數據庫&#xf…

Linux系統之whereis命令的基本使用

Linux系統之whereis命令的基本使用 一、whereis命令介紹二、whereis命令的使用幫助2.1 whereis命令的幫助信息2.2 whereis命令幫助解釋 三、whereis命令的基本使用3.1 查找命令的位置3.2 僅查找二進制文件3.3 僅查找手冊頁3.4 輸出實際使用的查找路徑3.5 指定自定義搜索路徑 四…

Autosar-以太網是怎么運行的?(Davinci配置部分)

寫在前面&#xff1a; 入行一段時間了&#xff0c;基于個人理解整理一些東西&#xff0c;如有錯誤&#xff0c;歡迎各位大佬評論區指正&#xff01;&#xff01;&#xff01; 目錄 1.Autosar ETH通訊軟件架構 2.Ethernet MCAL配置 2.1配置對應Pin屬性 2.2配置TXD引腳 2.3配…

2024年度總結

首先&#xff0c;我是在2023年結束高中生涯進入大學的&#xff0c;難免會有固化的“高中生”思維&#xff0c;我等著老師的安排&#xff0c;看著課表上課&#xff0c;跟著時間吃飯&#xff0c;睡覺&#xff0c;偶爾會熬夜&#xff0c;但整體跟高中沒差太多。我對社團沒興趣&…

【Block總結】CSAM,包含分割、關鍵點、切分等均適用!|即插即用

論文信息 標題: CSAM: A 2.5D Cross-Slice Attention Module for Anisotropic Volumetric Medical Image Segmentation 論文鏈接: https://arxiv.org/pdf/2311.04942 GitHub鏈接: https://github.com/aL3x-O-o-Hung/CSAM 創新點 CSAM&#xff08;跨切片注意力模塊&#xff…

解決PyG安裝中torch-sparse安裝失敗問題:詳細指南

1 問題描述 最近在學習GNN&#xff0c;需要使用PyTorch Geometric&#xff08;PyG&#xff09;庫。在安裝PyG的過程中&#xff0c;遇到了torch-sparse安裝失敗的問題&#xff0c;錯誤提示為&#xff1a; ERROR: Failed building wheel for torch-sparse本文將詳細記錄問題的解…

鳥哥Linux私房菜筆記(三)

鳥哥Linux私房菜筆記&#xff08;三&#xff09; 該第三部分和第四部分主要為原書的第十一章&#xff08;正則表達式與文件格式化處理&#xff09;&#xff0c;第十二章學習shell腳本&#xff0c;第十六章&#xff08;進程管理與SElinux初探部分&#xff09;&#xff0c;第十七…

學習日記-250203

一.論文 看師兄寫好的一稿。 二、計劃&#xff1a; 繼續看論文里的問題。 然后繼續看promptCD相關&#xff0c;明天要看論文啦,今天家里有些事比較忙&#xff08;碎碎念&#xff09; 三. &#xff09;——&#xff08; 注冊了 openreview,ORCID,Google scholar&…

python學opencv|讀取圖像(五十四)使用cv2.blur()函數實現圖像像素均值處理

【1】引言 前序學習進程中&#xff0c;對圖像的操作均基于各個像素點上的BGR值不同而展開。 對于彩色圖像&#xff0c;每個像素點上的BGR值為三個整數&#xff0c;因為是三通道圖像&#xff1b;對于灰度圖像&#xff0c;各個像素上的BGR值是一個整數&#xff0c;因為這是單通…

Kafka ACL(訪問控制列表)介紹

文章目錄 Kafka ACL&#xff08;訪問控制列表&#xff09;介紹1. Kafka ACL 的基本概念1.1 Kafka ACL 的目標1.2 Kafka ACL 的組成部分 2. Kafka 支持的資源類型2.1 Topic&#xff08;主題&#xff09;2.2 Consumer Group&#xff08;消費者組&#xff09;2.3 Cluster&#xff…

在 WSL2 中重啟 Ubuntu 實例

在 WSL2 中重啟 Ubuntu 實例&#xff0c;可以按照以下步驟操作&#xff1a; 方法 1: 使用 wsl 命令 關閉 Ubuntu 實例: 打開 PowerShell 或命令提示符&#xff0c;運行以下命令&#xff1a; wsl --shutdown這會關閉所有 WSL2 實例。 重新啟動 Ubuntu: 再次打開 Ubuntu&#x…

Spring Boot 2 快速教程:WebFlux處理流程(五)

WebFlux請求處理流程 下面是spring mvc的請求處理流程 具體步驟&#xff1a; 第一步&#xff1a;發起請求到前端控制器(DispatcherServlet) 第二步&#xff1a;前端控制器請求HandlerMapping查找 Handler &#xff08;可以根據xml配置、注解進行查找&#xff09; 匹配條件包括…

小程序設計和開發:如何研究同類型小程序的優點和不足。

一、確定研究目標和范圍 明確研究目的 在開始研究同類型小程序之前&#xff0c;首先需要明確研究的目的。是為了改進自己的小程序設計和開發&#xff0c;還是為了了解市場趨勢和用戶需求&#xff1f;不同的研究目的會影響研究的方法和重點。例如&#xff0c;如果研究目的是為了…

使用 Numpy 自定義數據集,使用pytorch框架實現邏輯回歸并保存模型,然后保存模型后再加載模型進行預測,對預測結果計算精確度和召回率及F1分數

1. 導入必要的庫 首先&#xff0c;導入我們需要的庫&#xff1a;Numpy、Pytorch 和相關工具包。 import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import accuracy_score, recall_score, f1_score2. 自定義數據集 …