目錄
1.QTableView簡介
2.QTableWidget簡介
3.QTableView和QTableWidget不同
4.總結
1.QTableView簡介
????????QTableView是一個基于模型-視圖架構的表格控件,用于展示表格形式的數據。同樣需要關聯一個QAbstractTableModel或其子類(如QStandardItemModel)來提供數據。這意味著數據存儲在模型中,而 QTableView 只負責顯示和編輯這些數據。它將數據顯示與數據存儲分離,提供了強大的靈活性和可擴展性,適合處理各種復雜的表格場景。
? ? ? ? 它在QT中的類繼承關系如下圖所示:
它的特點有:
1)高性能:采用懶加載機制,僅渲染可見區域的單元格,適合處理大量數據(如數萬行以上)。
2)高度可定制化:
- 支持自定義單元格渲染(通過?
QAbstractItemDelegate
)。 - 可定制行高、列寬、排序、篩選等功能。
- 通過樣式表(CSS)修改整體外觀。
可自定義單元格的渲染和編輯方式,例如顯示進度條、下拉框等:
class ProgressDelegate : public QItemDelegate {
public:void paint(QPainter *painter, const QStyleOptionViewItem &option,const QModelIndex &index) const override {// 繪制進度條int progress = index.data().toInt();QStyleOptionProgressBar progressBar;// ... 設置進度條參數QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBar, painter);}
};// 使用代理
tableView.setItemDelegateForColumn(2, new ProgressDelegate);
排序與篩選
// 啟用排序
tableView.setSortingEnabled(true);// 使用篩選器(如只顯示年齡>20的行)
QSortFilterProxyModel proxyModel;
proxyModel.setSourceModel(&originalModel);
proxyModel.setFilterRegExp("^[2-9][0-9]$");
proxyModel.setFilterKeyColumn(1); // 篩選第2列(年齡)
tableView.setModel(&proxyModel);
3)豐富的交互支持:支持單元格選擇、編輯、右鍵菜單、拖放等操作,并提供相應信號(如?clicked
、doubleClicked
)。
4)數據庫集成:通過?QSqlTableModel
?直接連接數據庫表:
#include <QSqlTableModel>
QSqlTableModel model;
model.setTable("employees");
model.select(); // 查詢數據
tableView.setModel(&model);
2.QTableWidget簡介
????????QTableWidget繼承于QTableView,它是一個結合了模型和視圖的控件,它內置了一個簡單的表格模型。這意味著你不需要單獨管理模型,可以直接通過QTableWidget的方法來操作數據。與?QTableView
?相比,QTableWidget
?的 API 更簡單直接,適合快速開發小規模、靜態數據的表格應用。
? ? ? ? 它的特點有:
1)集成數據存儲:無需額外的數據模型(如?QStandardItemModel
),可直接通過?setItem()
、setCellWidget()
?操作單元格數據。
2)簡單易用:提供直觀的 API,適合初學者快速實現表格功能,例如:
QTableWidget table(4, 2); // 創建4行2列的表格
table.setItem(0, 0, new QTableWidgetItem("張三"));
3)基本功能齊全:?支持單元格選擇、編輯、排序、行 / 列隱藏等常見操作。
4)視覺定制:可通過樣式表(CSS)修改外觀,或通過?setCellWidget()
?添加自定義控件(如按鈕、下拉框)。
3.QTableView和QTableWidget不同
特性 | QTableView | QTableWidget |
---|---|---|
數據模型 | 基于 MVC(模型 - 視圖 - 控制器)架構,需配合QAbstractItemModel 子類(如QStandardItemModel 、QSqlTableModel )使用。數據與視圖分離,支持大型數據集。 | 內置數據存儲(直接操作單元格),無需額外模型。適合小規模靜態數據。 |
使用復雜度 | 需手動創建和配置模型,學習成本較高,但靈活性極強。 | 開箱即用,API 簡單直接,適合快速開發。 |
性能 | 處理大量數據時性能更佳(如數萬行以上),僅渲染可見區域。 | 數據量較大時性能下降,因所有單元格預分配。 |
擴展性 | 可自定義模型實現高級功能(如異步加載、遠程數據)。 | 擴展困難,需繼承并重寫大量方法。 |
單元格操作 | 通過模型間接操作數據(如model.setData(index, value) )。 | 直接通過setItem() 、setCellWidget() 操作單元格。 |
典型應用場景
-
QTableView:
- 數據量龐大(如數據庫查詢結果)。
- 需要與其他組件共享數據模型。
- 需要自定義數據展示邏輯(如圖標、富文本、進度條)。
-
QTableWidget:
- 數據量較小且固定。
- 快速原型開發或簡單表格需求。
- 直接操作單元格內容(如 Excel 式編輯)。
示例代碼:QTableView + QStandardItemModel(C++)
#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>int main(int argc, char *argv[]) {QApplication a(argc, argv);// 創建模型QStandardItemModel model(4, 2); // 4行2列model.setHorizontalHeaderLabels({"姓名", "年齡"});// 設置數據model.setItem(0, 0, new QStandardItem("張三"));model.setItem(0, 1, new QStandardItem("25"));// 創建視圖并設置模型QTableView tableView;tableView.setModel(&model);tableView.show();return a.exec();
}
QTableWidget(C++)
#include <QApplication>
#include <QTableWidget>
#include <QTableWidgetItem>int main(int argc, char *argv[]) {QApplication a(argc, argv);// 創建表格,設置行列數QTableWidget tableWidget(4, 2);tableWidget.setHorizontalHeaderLabels({"姓名", "年齡"});// 設置數據tableWidget.setItem(0, 0, new QTableWidgetItem("張三"));tableWidget.setItem(0, 1, new QTableWidgetItem("25"));tableWidget.show();return a.exec();
}
4.總結
- 選 QTableView:當需要處理復雜數據邏輯或大量數據時,它提供更好的性能和可維護性。
- 選 QTableWidget:當需求簡單且數據量較小時,它能快速實現功能。
????????實際開發中,建議優先使用QTableView
,因為 MVC 架構更符合軟件工程原則,便于代碼擴展和維護。