目錄

1 -> 概述

2 -> QTableWidget 核心方法

3 -> QTableWidgetItem 核心信號

4 -> QTableWidgetItem 核心方法

5 -> 豐富多樣的內置控件庫

6 -> 核心優勢與設計哲學

7 -> 代碼示例

8 -> 總結


QT之QTableWidget控件_qtabelwidget_Qt

1 -> 概述

在圖形用户界面開發中,表格是展示和編輯結構化數據最直觀、最高效的組件之一。Qt 框架中的 QTableWidget 便是一個強大的表格控件,它極大地簡化了表格數據的顯示與交互。然而,它的真正威力並不僅僅在於展示文本和圖標,而在於其能將各種複雜的界面控件無縫集成到每一個單元格中,從而將一個簡單的表格轉變為一個高度交互、功能豐富的動態數據管理界面。

傳統的表格視圖往往侷限於顯示靜態的文本和數字。而 QTableWidget 通過其核心概念——單元格控件,徹底打破了這一侷限。開發者可以將任何繼承自 QWidget 的控件“置入”表格的單元格中,這使得每個單元格都可以成為一個獨立的、功能完備的交互單元。

這種設計哲學將表格從純粹的數據“顯示器”升級為數據的“編輯器”和“控制器”。用户不再需要跳轉到額外的對話框或窗口來修改數據,他們可以直接在表格內部完成所有操作,極大地提升了應用的流暢度和用户體驗。

2 -> QTableWidget 核心方法

方法

説明

item(int row, int column)

根據行數列數獲取指定的 QTableWidgetItem*

setItem(int row, int column, QTableWidget*)

根據行數列數設置表格中的元素

currentItem()

返回被選中的元素 QTableWidgetItem*

currentRow()

返回被選中元素是第幾行

currentColumn()

返回被選中元素是第幾列

row(QTableWidgetItem*)

獲取指定 item 是第幾行

column(QTableWidgetItem*)

獲取指定 item 是第幾列

rowCount()

獲取行數

columnCount()

獲取列數

insertRow(int row)

在第 row 行處插入新行

insertColumn(int column)

在第 column 列插入新列

removeRow(int row)

刪除第 row 行

removeColumn(int column)

刪除第 column 列

setHorizontalHeaderItem(int column, QTableWidget*)

設置指定列的表頭

setVerticalHeaderItem(int row, QTableWidget*)

設置指定行的表頭

3 -> QTableWidgetItem 核心信號

信號

説明

cellClicked(int row, int column)

點擊單元格時觸發

cellDoubleClicked(int row, int column)

雙擊單元格時觸發

cellEntered(int row, int column)

鼠標進入單元格時觸發

currentCellChanged(int row, int column, int previousRow, int previousColumn)

選中不同單元格時觸發

4 -> QTableWidgetItem 核心方法

方法

説明

row()

獲取當前是第幾行

column()

獲取當前是第幾列

setText(const QString&)

設置文本

setTextAlignment(int)

設置文本對齊

setIcon(const QIcon&)

設置圖標

setSelected(bool)

設置被選中

setSizeHints(const QSize&)

設置尺寸

setFont(const QFont&)

設置字體

5 -> 豐富多樣的內置控件庫

QTableWidget 能夠輕鬆容納 Qt 提供的幾乎所有基礎及高級控件,為不同的數據類型和交互需求提供了完美的解決方案:

  • 文本輸入與驗證:使用 QLineEdit 可以允許用户輸入單行文本。更進一步,您可以為其設置輸入驗證器,例如只允許輸入數字或符合特定格式的字符串,從而在源頭保證數據的有效性。
  • 布爾值選擇:對於“是/否”、“真/假”這類二元數據,QCheckBox 是最佳選擇。其直觀的勾選狀態讓數據的查看和修改一目瞭然。
  • 枚舉與列表選擇:當某個單元格的值需要從一個預定義的列表中選擇時,QComboBox 便派上了用場。它通過下拉列表的形式,既節省了空間,又確保了輸入值的準確性和一致性,非常適合用於“狀態”、“類別”等字段。
  • 數字微調:對於數值型數據,QSpinBox 和 QDoubleSpinBox 提供了精確且安全的輸入方式。用户可以通過上下按鈕微調數值,同時控件本身可以限制數值的範圍和步進,避免了無效輸入。
  • 進度可視化:在需要展示任務進度、完成百分比或任何度量值時,QProgressBar 可以直觀地將數字信息轉化為視覺化的條形圖,讓用户一眼就能把握整體情況。
  • 自定義按鈕與操作:您甚至可以在單元格中嵌入 QPushButton。點擊這個按鈕可以觸發特定的業務邏輯,例如“刪除此行”、“查看詳情”、“執行計算”等,將操作與數據緊密地綁定在一起。

6 -> 核心優勢與設計哲學

  1. 極致的用户體驗:通過將編輯控件內嵌於數據旁,實現了“就地編輯”,最大限度地減少了用户的鼠標移動和焦點切換,使數據操作變得高效而自然。
  2. 界面緊湊與高效:將所有功能和數據整合在一個視圖中,避免了因彈出過多窗口而導致的界面凌亂,保持了主界面的整潔和空間利用率。
  3. 靈活性與可定製性:由於可以自定義每個單元格的控件,您可以為同一表格中不同類型的數據列設計最合適的交互方式。這種靈活性使得 QTableWidget 能夠適應從簡單的配置表格到複雜的企業級數據管理系統的各種場景。
  4. 與數據模型的緊密結合:雖然 QTableWidget 是一個基於項的便捷類,但它底層依然與 Qt 的模型/視圖架構相連。您可以直接從這些單元格控件中獲取或設置數據,並輕鬆地將其同步到後台的數據結構或數據庫中。

7 -> 代碼示例

1. 在界面上創建 QTableWidget 和四個按鈕,一個輸入框

注意:QTableWidget 是 QTableView 的子類,功能比 QTableView 更豐富

QT之QTableWidget控件_qtabelwidget_控件_02

2. 編寫 widget.cpp 構造函數,構造表格中的初始數據

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 新增行
    ui->tableWidget->insertRow(0);
    ui->tableWidget->insertRow(1);
    ui->tableWidget->insertRow(2);
    // 新增列
    ui->tableWidget->insertColumn(0);
    ui->tableWidget->insertColumn(1);
    ui->tableWidget->insertColumn(2);
    // 設置列名
    ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("班級"));
    ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("姓名"));
    ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("學號"));
    // 設置元素
    ui->tableWidget->setItem(0, 0, new QTableWidgetItem("計科2201"));
    ui->tableWidget->setItem(0, 1, new QTableWidgetItem("syh"));
    ui->tableWidget->setItem(0, 2, new QTableWidgetItem("22"));
    ui->tableWidget->setItem(1, 0, new QTableWidgetItem("計科2202"));
    ui->tableWidget->setItem(1, 1, new QTableWidgetItem("zzl"));
    ui->tableWidget->setItem(1, 2, new QTableWidgetItem("36"));
    ui->tableWidget->setItem(2, 0, new QTableWidgetItem("計科2202"));
    ui->tableWidget->setItem(2, 1, new QTableWidgetItem("yun"));
    ui->tableWidget->setItem(2, 2, new QTableWidgetItem("01"));
}
Widget::~Widget()
{
    delete ui;
}

3. 編寫按鈕的 slot 函數

void Widget::on_pushButton_insertRow_clicked()
{
    // 獲取行數
    int rowCount = ui->tableWidget->rowCount();
    // 在最後一行之後新增行
    ui->tableWidget->insertRow(rowCount);
}
void Widget::on_pushButton_removeRow_clicked()
{
    // 獲取到選中的行
    int curRow = ui->tableWidget->currentRow();
    // 刪除選中行
    ui->tableWidget->removeRow(curRow);
}
void Widget::on_pushButton_insertColumn_clicked()
{
    // 獲取列數
    int colCount = ui->tableWidget->columnCount();
    // 在最後一行之後新增行
    ui->tableWidget->insertColumn(colCount);
    // 設置列名
    const QString& text = ui->lineEdit->text();
    ui->tableWidget->setHorizontalHeaderItem(colCount, new QTableWidgetItem(text));
}
void Widget::on_pushButton_removeColumn_clicked()
{
    // 獲取選中的列
    int curCol = ui->tableWidget->currentColumn();
    // 刪除選中列
    ui->tableWidget->removeColumn(curCol);
}

4. 執行程序,即可完成表格的基本操作

QT之QTableWidget控件_qtabelwidget_控件_03

8 -> 總結

Qt 的 QTableWidget 遠不止是一個顯示行列數據的簡單網格。通過其強大的多元素控件支持,它成功地模糊了數據展示與數據編輯之間的界限,將一個靜態的界面組件轉化為一個充滿活力的、應用程序與用户對話的核心舞台。當您需要在有限的空間內提供強大的數據交互能力時,充分利用 QTableWidget 的單元格控件特性,無疑是打造現代化、高效率桌面應用的一條捷徑。


感謝各位大佬支持!!!

互三啦!!!