PyQt6/PySide6 的 QTableView 類

QTableView 是 PyQt6 或 PySide6 庫中用于顯示二維表格數據的控件。它是一個非常強大且靈活的控件,適用于展示和編輯表格數據。QTableView 通常與 QAbstractItemModel 的子類(如 QStandardItemModel 或自定義模型)一起使用,以提供數據源。下面我將詳細介紹 QTableView 的主要特性及其使用方法。

1. 基本概念

  • 表格視圖:用于顯示二維表格數據的控件。
  • 模型-視圖架構QTableView 使用模型-視圖架構,其中 QTableView 是視圖部分,負責顯示數據;而模型(如 QStandardItemModel)則負責管理數據。
  • 列和行:表格中的基本單位,由行和列組成。
  • 單元格:表格中的單個數據項。
  • 選擇模式:控制用戶如何選擇單元格、行或列。
  • 排序:支持對表格數據進行排序。
  • 編輯模式:允許用戶直接在表格中編輯數據。

2. 創建 QTableView 實例

要使用 QTableView,首先需要導入相應的庫:

from PyQt6.QtWidgets import QApplication, QTableView, QVBoxLayout, QWidget, QPushButton
from PyQt6.QtGui import QStandardItemModel, QStandardItem
# 或者
from PySide6.QtWidgets import QApplication, QTableView, QVBoxLayout, QWidget, QPushButton
from PySide6.QtGui import QStandardItemModel, QStandardItem

接著創建一個窗口,并在其中添加 QTableView 控件:

class MyWindow(QWidget):def __init__(self):super().__init__()self.setWindowTitle("我的應用程序")self.setGeometry(100, 100, 800, 600)# 初始化UIself.initUI()def initUI(self):layout = QVBoxLayout()# 創建表格視圖self.table_view = QTableView(self)# 創建模型self.model = QStandardItemModel(4, 3)  # 4行3列self.model.setHorizontalHeaderLabels(['姓名', '年齡', '職業'])# 添加數據self.model.setItem(0, 0, QStandardItem('張三'))self.model.setItem(0, 1, QStandardItem('28'))self.model.setItem(0, 2, QStandardItem('工程師'))self.model.setItem(1, 0, QStandardItem('李四'))self.model.setItem(1, 1, QStandardItem('32'))self.model.setItem(1, 2, QStandardItem('教師'))self.model.setItem(2, 0, QStandardItem('王五'))self.model.setItem(2, 1, QStandardItem('25'))self.model.setItem(2, 2, QStandardItem('醫生'))self.model.setItem(3, 0, QStandardItem('趙六'))self.model.setItem(3, 1, QStandardItem('30'))self.model.setItem(3, 2, QStandardItem('律師'))# 設置模型到視圖self.table_view.setModel(self.model)# 添加按鈕button = QPushButton("打印選中項", self)button.clicked.connect(self.print_selection)# 添加到布局layout.addWidget(self.table_view)layout.addWidget(button)self.setLayout(layout)def print_selection(self):selected_indices = self.table_view.selectedIndexes()for index in selected_indices:row = index.row()column = index.column()value = index.data()print(f"行: {row}, 列: {column}, 值: {value}")if __name__ == "__main__":app = QApplication([])window = MyWindow()window.show()app.exec()

3. QTableView 的常用屬性和方法

屬性
  • model:獲取或設置當前使用的模型。
  • selectionModel:獲取或設置當前的選擇模型。
  • currentIndex:獲取或設置當前選中的索引。
  • horizontalHeader:獲取水平表頭。
  • verticalHeader:獲取垂直表頭。
  • cornerButtonEnabled:獲取或設置是否啟用角落按鈕。
  • showGrid:獲取或設置是否顯示網格線。
  • gridStyle:獲取或設置網格線樣式。
  • alternatingRowColors:獲取或設置是否交替行顏色。
  • sortingEnabled:獲取或設置是否啟用排序。
  • wordWrap:獲取或設置是否啟用自動換行。
  • resizeMode:獲取或設置調整大小模式。
  • selectionBehavior:獲取或設置選擇行為(選擇單元格、行或列)。
  • selectionMode:獲取或設置選擇模式(單選或多選)。
  • editTriggers:獲取或設置編輯觸發器。
  • toolTip:獲取或設置工具提示文本。
  • statusTip:獲取或設置狀態欄提示文本。
方法
  • setModel(QAbstractItemModel):設置當前使用的模型。
  • model() -> QAbstractItemModel:獲取當前使用的模型。
  • setSelectionModel(QItemSelectionModel):設置當前的選擇模型。
  • selectionModel() -> QItemSelectionModel:獲取當前的選擇模型。
  • setCurrentIndex(QModelIndex):設置當前選中的索引。
  • currentIndex() -> QModelIndex:獲取當前選中的索引。
  • horizontalHeader() -> QHeaderView:獲取水平表頭。
  • verticalHeader() -> QHeaderView:獲取垂直表頭。
  • setCornerButtonEnabled(bool):設置是否啟用角落按鈕。
  • isCornerButtonEnabled() -> bool:判斷是否啟用角落按鈕。
  • setShowGrid(bool):設置是否顯示網格線。
  • showGrid() -> bool:判斷是否顯示網格線。
  • setGridStyle(Qt.PenStyle):設置網格線樣式。
  • gridStyle() -> Qt.PenStyle:獲取網格線樣式。
  • setAlternatingRowColors(bool):設置是否交替行顏色。
  • alternatingRowColors() -> bool:判斷是否交替行顏色。
  • setSortingEnabled(bool):設置是否啟用排序。
  • isSortingEnabled() -> bool:判斷是否啟用排序。
  • setWordWrap(bool):設置是否啟用自動換行。
  • wordWrap() -> bool:判斷是否啟用自動換行。
  • setResizeMode(QHeaderView.ResizeMode):設置調整大小模式。
  • resizeMode() -> QHeaderView.ResizeMode:獲取調整大小模式。
  • setSelectionBehavior(QAbstractItemView.SelectionBehavior):設置選擇行為。
  • selectionBehavior() -> QAbstractItemView.SelectionBehavior:獲取選擇行為。
  • setSelectionMode(QAbstractItemView.SelectionMode):設置選擇模式。
  • selectionMode() -> QAbstractItemView.SelectionMode:獲取選擇模式。
  • setEditTriggers(QAbstractItemView.EditTrigger):設置編輯觸發器。
  • editTriggers() -> QAbstractItemView.EditTrigger:獲取編輯觸發器。
  • setToolTip(str):設置工具提示文本。
  • toolTip() -> str:獲取工具提示文本。
  • setStatusTip(str):設置狀態欄提示文本。
  • statusTip() -> str:獲取狀態欄提示文本。
  • selectRow(int):選擇指定行。
  • selectColumn(int):選擇指定列。
  • clearSelection():清除選擇。
  • selectAll():全選。
  • selectedIndexes() -> List[QModelIndex]:獲取所有選中的索引。
  • resizeColumnsToContents():根據內容調整列寬。
  • resizeRowsToContents():根據內容調整行高。
  • hideColumn(int):隱藏指定列。
  • showColumn(int):顯示指定列。
  • hideRow(int):隱藏指定行。
  • showRow(int):顯示指定行。

4. 詳細示例

設置模型
# 創建模型
model = QStandardItemModel(4, 3)  # 4行3列
model.setHorizontalHeaderLabels(['姓名', '年齡', '職業'])# 添加數據
model.setItem(0, 0, QStandardItem('張三'))
model.setItem(0, 1, QStandardItem('28'))
model.setItem(0, 2, QStandardItem('工程師'))
model.setItem(1, 0, QStandardItem('李四'))
model.setItem(1, 1, QStandardItem('32'))
model.setItem(1, 2, QStandardItem('教師'))
model.setItem(2, 0, QStandardItem('王五'))
model.setItem(2, 1, QStandardItem('25'))
model.setItem(2, 2, QStandardItem('醫生'))
model.setItem(3, 0, QStandardItem('趙六'))
model.setItem(3, 1, QStandardItem('30'))
model.setItem(3, 2, QStandardItem('律師'))# 設置模型到視圖
table_view.setModel(model)
獲取當前選中的索引
def print_selection():selected_indices = table_view.selectedIndexes()for index in selected_indices:row = index.row()column = index.column()value = index.data()print(f"行: {row}, 列: {column}, 值: {value}")
選擇行或列
# 選擇第1行
table_view.selectRow(1)# 選擇第2列
table_view.selectColumn(2)
清除選擇
table_view.clearSelection()
全選
table_view.selectAll()
根據內容調整列寬和行高
table_view.resizeColumnsToContents()
table_view.resizeRowsToContents()
隱藏和顯示列或行
# 隱藏第2列
table_view.hideColumn(2)# 顯示第2列
table_view.showColumn(2)# 隱藏第3行
table_view.hideRow(3)# 顯示第3行
table_view.showRow(3)
啟用或禁用排序
table_view.setSortingEnabled(True)  # 啟用排序
table_view.setSortingEnabled(False)  # 禁用排序
設置選擇行為
table_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)  # 選擇整行
table_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectColumns)  # 選擇整列
table_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectItems)  # 選擇單元格
設置選擇模式
table_view.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)  # 單選
table_view.setSelectionMode(QAbstractItemView.SelectionMode.ContiguousSelection)  # 連續多選
table_view.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)  # 擴展多選
table_view.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection)  # 多選
設置編輯觸發器
table_view.setEditTriggers(QAbstractItemView.EditTrigger.DoubleClicked | QAbstractItemView.EditTrigger.SelectedClicked)  # 雙擊或選中后點擊編輯
設置工具提示和狀態欄提示
table_view.setToolTip("這是一個表格視圖")
table_view.setStatusTip("查看和編輯數據")

5. 信號與槽機制

QTableView 支持多種信號,這些信號可以在用戶交互時發射。常見的信號包括 clickeddoubleClickedpressedactivatedselectionChanged。你可以通過連接這些信號到槽函數來處理用戶的輸入事件。

def on_clicked(index):row = index.row()column = index.column()value = index.data()print(f"點擊: 行: {row}, 列: {column}, 值: {value}")def on_double_clicked(index):row = index.row()column = index.column()value = index.data()print(f"雙擊: 行: {row}, 列: {column}, 值: {value}")def on_pressed(index):row = index.row()column = index.column()value = index.data()print(f"按下: 行: {row}, 列: {column}, 值: {value}")def on_activated(index):row = index.row()column = index.column()value = index.data()print(f"激活: 行: {row}, 列: {column}, 值: {value}")def on_selection_changed(selected, deselected):print("選擇發生變化")table_view.clicked.connect(on_clicked)
table_view.doubleClicked.connect(on_double_clicked)
table_view.pressed.connect(on_pressed)
table_view.activated.connect(on_activated)
table_view.selectionModel().selectionChanged.connect(on_selection_changed)

6. 自定義樣式

除了使用內置的樣式設置外,你還可以通過樣式表(QSS)來自定義 QTableView 的外觀。樣式表類似于CSS,提供了強大的樣式控制能力。

table_view.setStyleSheet("""QTableView {background-color: #f0f0f0;alternate-background-color: #e0e0e0;selection-background-color: #0078d7;selection-color: white;gridline-color: #cccccc;border: 1px solid #cccccc;}QTableView::item {padding: 5px;}QTableView::item:selected {background-color: #0078d7;color: white;}QTableView::item:hover {background-color: #d0d0d0;}QTableView::item:focus {outline: none;}QHeaderView::section {background-color: #e0e0e0;border: 1px solid #cccccc;padding: 5px;}QHeaderView::section:checked {background-color: #0078d7;color: white;}
""")

7. 動態更新和控制

你可以動態地更新 QTableView 的內容,或者根據某些條件控制其行為。例如,在定時器或其他事件觸發時更新表格的數據。

import time
from PyQt6.QtCore import QTimerclass MyWindow(QWidget):def __init__(self):super().__init__()self.setWindowTitle("我的應用程序")self.setGeometry(100, 100, 800, 600)# 初始化UIself.initUI()# 創建定時器self.timer = QTimer(self)self.timer.timeout.connect(self.update_table_view)self.timer.start(5000)  # 每5秒觸發一次def initUI(self):layout = QVBoxLayout()# 創建表格視圖self.table_view = QTableView(self)# 創建模型self.model = QStandardItemModel(4, 3)  # 4行3列self.model.setHorizontalHeaderLabels(['姓名', '年齡', '職業'])# 添加數據self.model.setItem(0, 0, QStandardItem('張三'))self.model.setItem(0, 1, QStandardItem('28'))self.model.setItem(0, 2, QStandardItem('工程師'))self.model.setItem(1, 0, QStandardItem('李四'))self.model.setItem(1, 1, QStandardItem('32'))self.model.setItem(1, 2, QStandardItem('教師'))self.model.setItem(2, 0, QStandardItem('王五'))self.model.setItem(2, 1, QStandardItem('25'))self.model.setItem(2, 2, QStandardItem('醫生'))self.model.setItem(3, 0, QStandardItem('趙六'))self.model.setItem(3, 1, QStandardItem('30'))self.model.setItem(3, 2, QStandardItem('律師'))# 設置模型到視圖self.table_view.setModel(self.model)# 添加到布局layout.addWidget(self.table_view)self.setLayout(layout)def update_table_view(self):# 更新模型數據self.model.clear()self.model.setHorizontalHeaderLabels(['姓名', '年齡', '職業'])# 添加新的數據self.model.setItem(0, 0, QStandardItem('張三'))self.model.setItem(0, 1, QStandardItem('29'))self.model.setItem(0, 2, QStandardItem('工程師'))self.model.setItem(1, 0, QStandardItem('李四'))self.model.setItem(1, 1, QStandardItem('33'))self.model.setItem(1, 2, QStandardItem('教師'))self.model.setItem(2, 0, QStandardItem('王五'))self.model.setItem(2, 1, QStandardItem('26'))self.model.setItem(2, 2, QStandardItem('醫生'))self.model.setItem(3, 0, QStandardItem('趙六'))self.model.setItem(3, 1, QStandardItem('31'))self.model.setItem(3, 2, QStandardItem('律師'))if __name__ == "__main__":app = QApplication([])window = MyWindow()window.show()app.exec()

總結

QTableView 是 PyQt6/PySide6 中非常強大且靈活的控件,適用于各種需要展示和編輯表格數據的場景。通過設置不同的屬性和使用樣式表,你可以創建出豐富多樣的表格視圖樣式。同時,通過信號與槽機制,你可以方便地處理用戶的輸入事件。希望以上內容能幫助你更好地理解和運用 QTableView,并能夠根據具體需求創建出功能豐富且用戶友好的表格視圖控件。

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

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

相關文章

【嵌入式】C語言多文件編程與內聯函數

文章目錄 0 前言1 從C語言編譯說起2 重復定義錯誤(ODR violation)和條件編譯3 內聯函數inline和static inline4 總結 0 前言 最近在研究ARM內核代碼時,看到core_cm3.h中有大量的內聯函數,為此查閱了很多資料,也和朋友討…

10分鐘本地部署Deepseek-R1

10分鐘本地部署DeepSeek-R1 什么是DeepSeek-R1快速本地部署DeepSeek-R1Ollama下載Ollama安裝檢查是否安裝成功 安裝DeepSeek-R1模型模型使用測試 什么是DeepSeek-R1 DeepSeek-R1是中國的深度求索(DeepSeek)公司開發的智能助手。其具有極佳的語義理解和生…

Office / WPS 公式、Mathtype 公式輸入花體字、空心字

注:引文主要看注意事項。 1、Office / WPS 公式中字體轉換 花體字 字體選擇 “Eulid Math One” 空心字 字體選擇 “Eulid Math Two” 2、Mathtype 公式輸入花體字、空心字 2.1 直接輸入 花體字 在 mathtype 中直接輸入 \mathcal{L} L \Large \mathcal{L} L…

Python小游戲29乒乓球

import pygame import sys # 初始化pygame pygame.init() # 屏幕大小 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("打乒乓球") # 顏色定義 WHITE (255, 255, 255) BLACK (…

【C++】STL——vector底層實現

目錄 💕 1.vector三個核心 💕2.begin函數,end函數的實現(簡單略講) 💕3.size函數,capacity函數的實現 (簡單略講) 💕4.reserve函數實現 (細節…

7、怎么定義一個簡單的自動化測試框架?

定義一個簡單的自動化測試框架可以從需求理解、框架設計、核心模塊實現、測試用例編寫和集成執行等方面入手,以下為你詳細介紹: 1. 明確框架需求和范圍 確定測試類型:明確框架要支持的測試類型,如單元測試、接口測試、UI 測試等…

安卓(android)讀取手機通訊錄【Android移動開發基礎案例教程(第2版)黑馬程序員】

一、實驗目的(如果代碼有錯漏,可在代碼地址查看) 1.熟悉內容提供者(Content Provider)的概念和作用。 2.掌握內容提供者的創建和使用方法。 4.掌握內容URI的結構和用途。 二、實驗條件 1.熟悉內容提供者的工作原理。 2.掌握內容提供者訪問其…

AI取代人類?

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

C語言-----數據結構從門到精通

1.數據結構基本概念 數據結構是計算機中存儲、組織數據的方式,旨在提高數據的訪問和操作效率。它是實現高效算法和程序設計的基石。 目標:通過思維導圖了解數據結構的知識點,并掌握。 1.1邏輯結構 邏輯結構主要四種類型: 集合:結構中的數據元素之…

華為小米vivo向上,蘋果榮耀OPPO向下

日前,Counterpoint發布的手機銷量月度報告顯示,中國智能手機銷量在2024年第四季度同比下降3.2%,成為2024年唯一出現同比下滑的季度。而對于各大智能手機品牌來說,他們的市場份額和格局也在悄然發生變化。 華為逆勢向上 在2024年第…

每日一博 - 三高系統架構設計:高性能、高并發、高可用性解析

文章目錄 引言一、高性能篇1.1 高性能的核心意義1.2 影響系統性能的因素1.3 高性能優化方法論1.3.1 讀優化:緩存與數據庫的結合1.3.2 寫優化:異步化處理 1.4 高性能優化實踐1.4.1 本地緩存 vs 分布式緩存1.4.2 數據庫優化 二、高并發篇2.1 高并發的核心意…

吳恩達深度學習——有效運作神經網絡

內容來自https://www.bilibili.com/video/BV1FT4y1E74V,僅為本人學習所用。 文章目錄 訓練集、驗證集、測試集偏差、方差正則化正則化參數為什么正則化可以減少過擬合Dropout正則化Inverted Dropout其他的正則化方法數據增廣Early stopping 歸一化梯度消失與梯度爆…

20【變量的深度理解】

一說起變量,懂點編程的都知道,但是在理解上可能還不夠深 變量就是存儲空間,電腦上的存儲空間有永久(硬盤)和臨時(內存條)兩種,永久數據重啟電腦后依舊存在,臨時數據只…

RESTful API的設計原則與這些原則在Java中的應用

RESTful API 是基于 REST(Representational State Transfer) 架構風格設計的 API,其核心目標是提高系統的可伸縮性、簡潔性和可維護性。以下是 RESTful API 的設計原則及在 Java 中的實現方法: 一、RESTful API 的核心設計原則 客…

【apt源】RK3588 平臺ubuntu20.04更換apt源

RK3588芯片使用的是aarch64架構,因此在Ubuntu 20.04上更換apt源時需要使用針對aarch64架構的源地址。以下是針對RK3588芯片在Ubuntu 20.04上更換apt源到清華源的正確步驟: 步驟一:打開終端 在Ubuntu 20.04中,按下Ctrl Alt T打…

k8s二進制集群之Kube ApiServer部署

創建kube工作目錄(僅在主節點上創建即可)同樣在我們的部署主機上創建apiserver證書請求文件根據證書文件生成apiserver證書僅接著創建TLS所需要的TOKEN創建apiserver服務的配置文件(僅在主節點上創建即可)創建apiserver服務管理配置文件對所有master節點分發證書 & TOK…

基于RK3588/RK3576+MCU STM32+AI的儲能電站電池簇管理系統設計與實現

伴隨近年來新型儲能技術的高質量規模化發展,儲能電站作為新能源領域的重要載體, 旨在配合逐步邁進智能電網時代,滿足電力系統能源結構與分布的創新升級,給予相應規模 電池管理系統的設計與實現以新的挑戰。同時,電子系…

K8s 分布式存儲后端(K8s Distributed Storage Backend)

K8s 分布式存儲后端 在 K8s 中實現分布式存儲后端對于管理跨集群的持久數據、確保高可用性、可擴展性和可靠性至關重要。在 K8s 環境中,應用程序通常被容器化并跨多個節點部署。雖然 K8s 可以有效處理無狀態應用程序,但有狀態應用程序需要持久存儲來維護…

FFmpeg:多媒體處理的瑞士軍刀

FFmpeg:多媒體處理的瑞士軍刀 前言 FFmpeg 是一個功能強大且跨平臺的開源多媒體框架,廣泛應用于音視頻處理領域。 它由多個庫和工具組成,能夠處理各種音視頻格式,涵蓋編碼、解碼、轉碼、流處理等多種操作。 無論是專業視頻編輯…

unordered_map/set的哈希封裝

【C筆記】unordered_map/set的哈希封裝 🔥個人主頁:大白的編程日記 🔥專欄:C筆記 文章目錄 【C筆記】unordered_map/set的哈希封裝前言一. 源碼及框架分析二.迭代器三.operator[]四.使用哈希表封裝unordered_map/set后言 前言 哈…