面試題:QTableView和QTableWidget的異同

目錄

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)豐富的交互支持:支持單元格選擇、編輯、右鍵菜單、拖放等操作,并提供相應信號(如?clickeddoubleClicked)。

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不同

特性QTableViewQTableWidget
數據模型基于 MVC(模型 - 視圖 - 控制器)架構,需配合QAbstractItemModel子類(如QStandardItemModelQSqlTableModel)使用。數據與視圖分離,支持大型數據集。內置數據存儲(直接操作單元格),無需額外模型。適合小規模靜態數據。
使用復雜度需手動創建和配置模型,學習成本較高,但靈活性極強。開箱即用,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 架構更符合軟件工程原則,便于代碼擴展和維護。

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

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

相關文章

smbd:快速拉取服務端SMB共享文件腳本工具

地址:https://github.com/MartinxMax/smbd smbd 是一款簡單的 Bash 腳本&#xff0c;用於自動化從共享目錄透過 SMB/CIFS 協議下載檔案的過程。此工具設計用來與遠端 SMB 分享進行互動&#xff0c;並將其內容下載到本地目錄中。 環境需求 $ apt install smbclient 使用方式 …

MiInsertVad函數分析之nt!MMVAD結構

MiInsertVad函數分析之nt!MMVAD結構 1: kd> dt nt!MMVAD 89520270 0x000 u1 : __unnamed 0x004 LeftChild : (null) 0x008 RightChild : (null) 0x00c StartingVpn : 0x2b0 0x010 EndingVpn : 0x2c5 0x014 u …

OSPF不規則區域劃分

1、建立一條虛鏈路 vlink 可以被視為是??區域的?段延伸。 這?條虛擬的鏈路&#xff0c;只能夠跨域?個???區域。 [r2-ospf-1-area-0.0.0.1]vlink-peer 3.3.3.3 [r3-ospf-1-area-0.0.0.1]vlink-peer 2.2.2.2 在沒有建立虛鏈路之前,r1是不能ping r4的。vlink建?的鄰居關…

Webug4.0靶場通關筆記-靶場搭建方法(3種方法)

目錄 一、虛擬機綠色版本 1. 開啟phpstudy 2. 訪問靶場 二、Docker版本 1.拉取鏡像 2.啟動鏡像 三、源碼安裝版本 1. 搭建環境 &#xff08;1&#xff09;安裝PHPStudy &#xff08;2&#xff09;WeBug4.0靶場源碼 &#xff08;3&#xff09;安裝Navicat &#xff…

Linux:進程間通信---消息隊列信號量

文章目錄 1.消息隊列1.1 消息隊列的原理1.2 消息隊列的系統接口 2. 信號量2.1 信號量的系統調用接口 3. 淺談進程間通信3.1 IPC在內核中數據結構設計3.2 共享內存的缺點3.3 理解信號量 序&#xff1a;在上一章中&#xff0c;我們引出了命名管道和共享內存的概念&#xff0c;了解…

電子電器架構 --- 車載網關的設計

我是穿拖鞋的漢子&#xff0c;魔都中堅持長期主義的汽車電子工程師。 老規矩&#xff0c;分享一段喜歡的文字&#xff0c;避免自己成為高知識低文化的工程師&#xff1a; 鈍感力的“鈍”&#xff0c;不是木訥、遲鈍&#xff0c;而是直面困境的韌勁和耐力&#xff0c;是面對外界…

華為云Git使用與GitCode操作指南

案例介紹 本文檔帶領開發者學習如何在云主機上基于GitCode來使用Git來管理自己的項目代碼,并使用一些常用的Git命令來進行Git環境的設置。 案例內容 1 概述 1.1 背景介紹 Git 是一個快速、可擴展的分布式版本控制系統,它擁有異常豐富的命令集,可以提供高級操作和對內部…

ESP32開發入門(七):HTTP開發實踐

一、HTTP協議基礎 1.1 什么是HTTP&#xff1f; HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;是互聯網上應用最為廣泛的一種網絡協議&#xff0c;用于從服務器傳輸超文本到本地瀏覽器。它是一種無狀態的請求/響應協議&#xff0c;工作…

Python 對象引用、可變性和垃圾 回收(變量不是盒子)

變量不是盒子 1997 年夏天&#xff0c;我在 MIT 學了一門 Java 課程。Lynn Andrea Stein 教授 &#xff08;一位獲獎的計算機科學教育工作者&#xff0c;目前在歐林工程學院教書&#xff09;指 出&#xff0c;人們經常使用“變量是盒子”這樣的比喻&#xff0c;但是這有礙于理…

局域網常用的測速工具,Iperf3使用教程

目錄 下載方式 Windows Linux 使用方法&#xff1a;測試局域網帶寬 步驟一&#xff1a;服務端準備 步驟二&#xff1a;客戶端發起連接 步驟三&#xff1a;查看結果 參數說明 1. Iperf常用參數&#xff08;測試夠用&#xff09; 2. 通用參數&#xff08;Server端和Cli…

《深入理解分布式系統》之認識分布式系統

本文是閱讀深入理解分布式系統第一章認識分布式系統時的筆記。 分布式系統的特點 多進程不共享操作系統不共享時鐘 分布式系統 由多個可獨立運行的子系統組成。每個子系統可以獨立選擇運行平臺。不同的運行平臺存在差異&#xff0c;比如操作系統&#xff0c;硬件規格等。由…

UE5 PCG學習筆記

https://www.bilibili.com/video/BV1onUdY2Ei3/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 一、安裝PCG 插件里選擇以下進行安裝 移動目錄后&#xff0c;可以使用 Update Redirector References&#xff0c;更新下&#xff0…

工業現場ModbusTCP轉EtherNETIP網關引領生物現場領新浪潮

生物質發生器是一種能夠產生、培養生物的設備。客戶現場需要將生物發生器連接到羅克韋爾系統&#xff0c;但是二者協議無法直接通訊&#xff0c;需要通過ModbusTCP轉Ethernet/IP網關將兩者進行通訊連接&#xff0c;生物質發生器以其獨特的工作原理和優勢&#xff0c;使得生物的…

寶藍德中間件部署war包時,配置的絕對路徑讀取錯誤。

文章目錄 問題場景解決辦法寶藍德是什么&#xff1f;&#xff1f;一、基礎環境與依賴配置二、自動化部署工具鏈三、高可用性與集群配置四、安全與合規性措施五、產品線差異化部署六、典型部署流程示例七、運維與優化 原因1. 明確“當前工作目錄”與“絕對路徑”的關系2. 問題根…

Java、Python、NodeJS等開發環境安裝及配置鏡像加速到國內源

文章目錄 Java1.Windows1.1 scoop方式安裝JDK 2.Linux2.1 apt方式安裝JDK2.1.1 切換JDK2.1.2 驗證版本2.1.3 原理 Python1.Windows1.1 scoop方式安裝Python1.2 uv方式安裝Python&#xff08;推薦&#xff09; 2.Linux2.1 apt方式安裝Python2.1.1 配置版本切換2.1.2 切換Python2…

Linux系統管理與編程16:PXE自動化安裝部署centos7.9操作系統

蘭生幽谷&#xff0c;不為莫服而不芳&#xff1b; 君子行義&#xff0c;不為莫知而止休。 0.準備 1&#xff09;防火墻和SELinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config (很不好的…

MCP(Model Context Protocol)是專為LLM(大語言模型)應用設計的標準化協議

核心定義 MCP&#xff08;Model Context Protocol&#xff09;是專為LLM&#xff08;大語言模型&#xff09;應用設計的標準化協議&#xff0c;通過安全可控的方式向AI應用暴露數據和功能。主要提供以下能力&#xff1a; 標準化的上下文管理安全的功能調用接口跨平臺的數據交…

Fiori學習專題三十四:Responsiveness

在這一步中&#xff0c;我們提高了應用程序的響應能力。SAPUI5應用程序可以在手機、平板電腦和臺式機設備上運行&#xff0c;我們可以配置應用程序以充分利用每種場景的屏幕狀態。幸運的是&#xff0c;像sap.m.Table這樣的SAPUI5控件已經提供了許多我們可以使用的功能。 1.修改…

解決 TimeoutError: [WinError 10060] 在 FramePack項目中連接 Hugging Face 超時的問題

#工作記錄 以下是針對 TimeoutError: [WinError 10060] 的完整排查方案&#xff0c;適用于 FramePack項目中。 &#xff08;一般該錯誤的發生原因請重點排查Hugging Face模型倉庫受限需要登錄的情形&#xff09; FramePack項目參考資料 FramePack部署&#xff08;從PyCharm解…

obj = null; 賦值null之前沒有其他引用指向obj對象,那么,當obj=null時,會被垃圾回收機制立即回收嗎?

不會立即回收。 具體原因是&#xff1a; 賦值 obj null; 后&#xff0c;對象變成“不可達”&#xff0c;符合垃圾回收條件&#xff0c;但垃圾回收器并不會立刻回收它。垃圾回收是CLR自動控制的非確定性過程&#xff0c;什么時候執行回收取決于系統內存壓力、GC策略、分代情況…