PyQt6/PySide6中QTableView類的實(shí)現(xiàn)
QTableView
是 PyQt6 或 PySide6 庫(kù)中用于顯示二維表格數(shù)據(jù)的控件。它是一個(gè)非常強(qiáng)大且靈活的控件,適用于展示和編輯表格數(shù)據(jù)。QTableView
通常與 QAbstractItemModel
的子類(如 QStandardItemModel
或自定義模型)一起使用,以提供數(shù)據(jù)源。下面我將詳細(xì)介紹 QTableView
的主要特性及其使用方法。
1. 基本概念
- 表格視圖:用于顯示二維表格數(shù)據(jù)的控件。
- 模型-視圖架構(gòu):
QTableView
使用模型-視圖架構(gòu),其中QTableView
是視圖部分,負(fù)責(zé)顯示數(shù)據(jù);而模型(如QStandardItemModel
)則負(fù)責(zé)管理數(shù)據(jù)。 - 列和行:表格中的基本單位,由行和列組成。
- 單元格:表格中的單個(gè)數(shù)據(jù)項(xiàng)。
- 選擇模式:控制用戶如何選擇單元格、行或列。
- 排序:支持對(duì)表格數(shù)據(jù)進(jìn)行排序。
- 編輯模式:允許用戶直接在表格中編輯數(shù)據(jù)。
2. 創(chuàng)建 QTableView 實(shí)例
要使用 QTableView
,首先需要導(dǎo)入相應(yīng)的庫(kù):
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
接著創(chuàng)建一個(gè)窗口,并在其中添加 QTableView
控件:
class MyWindow(QWidget): def __init__(self): super().__init__() self.setWindowTitle("我的應(yīng)用程序") self.setGeometry(100, 100, 800, 600) # 初始化UI self.initUI() def initUI(self): layout = QVBoxLayout() # 創(chuàng)建表格視圖 self.table_view = QTableView(self) # 創(chuàng)建模型 self.model = QStandardItemModel(4, 3) # 4行3列 self.model.setHorizontalHeaderLabels(['姓名', '年齡', '職業(yè)']) # 添加數(shù)據(jù) 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('醫(yī)生')) self.model.setItem(3, 0, QStandardItem('趙六')) self.model.setItem(3, 1, QStandardItem('30')) self.model.setItem(3, 2, QStandardItem('律師')) # 設(shè)置模型到視圖 self.table_view.setModel(self.model) # 添加按鈕 button = QPushButton("打印選中項(xiàng)", 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:獲取或設(shè)置當(dāng)前使用的模型。
- selectionModel:獲取或設(shè)置當(dāng)前的選擇模型。
- currentIndex:獲取或設(shè)置當(dāng)前選中的索引。
- horizontalHeader:獲取水平表頭。
- verticalHeader:獲取垂直表頭。
- cornerButtonEnabled:獲取或設(shè)置是否啟用角落按鈕。
- showGrid:獲取或設(shè)置是否顯示網(wǎng)格線。
- gridStyle:獲取或設(shè)置網(wǎng)格線樣式。
- alternatingRowColors:獲取或設(shè)置是否交替行顏色。
- sortingEnabled:獲取或設(shè)置是否啟用排序。
- wordWrap:獲取或設(shè)置是否啟用自動(dòng)換行。
- resizeMode:獲取或設(shè)置調(diào)整大小模式。
- selectionBehavior:獲取或設(shè)置選擇行為(選擇單元格、行或列)。
- selectionMode:獲取或設(shè)置選擇模式(單選或多選)。
- editTriggers:獲取或設(shè)置編輯觸發(fā)器。
- toolTip:獲取或設(shè)置工具提示文本。
- statusTip:獲取或設(shè)置狀態(tài)欄提示文本。
方法
- setModel(QAbstractItemModel):設(shè)置當(dāng)前使用的模型。
- model() -> QAbstractItemModel:獲取當(dāng)前使用的模型。
- setSelectionModel(QItemSelectionModel):設(shè)置當(dāng)前的選擇模型。
- selectionModel() -> QItemSelectionModel:獲取當(dāng)前的選擇模型。
- setCurrentIndex(QModelIndex):設(shè)置當(dāng)前選中的索引。
- currentIndex() -> QModelIndex:獲取當(dāng)前選中的索引。
- horizontalHeader() -> QHeaderView:獲取水平表頭。
- verticalHeader() -> QHeaderView:獲取垂直表頭。
- setCornerButtonEnabled(bool):設(shè)置是否啟用角落按鈕。
- isCornerButtonEnabled() -> bool:判斷是否啟用角落按鈕。
- setShowGrid(bool):設(shè)置是否顯示網(wǎng)格線。
- showGrid() -> bool:判斷是否顯示網(wǎng)格線。
- setGridStyle(Qt.PenStyle):設(shè)置網(wǎng)格線樣式。
- gridStyle() -> Qt.PenStyle:獲取網(wǎng)格線樣式。
- setAlternatingRowColors(bool):設(shè)置是否交替行顏色。
- alternatingRowColors() -> bool:判斷是否交替行顏色。
- setSortingEnabled(bool):設(shè)置是否啟用排序。
- isSortingEnabled() -> bool:判斷是否啟用排序。
- setWordWrap(bool):設(shè)置是否啟用自動(dòng)換行。
- wordWrap() -> bool:判斷是否啟用自動(dòng)換行。
- setResizeMode(QHeaderView.ResizeMode):設(shè)置調(diào)整大小模式。
- resizeMode() -> QHeaderView.ResizeMode:獲取調(diào)整大小模式。
- setSelectionBehavior(QAbstractItemView.SelectionBehavior):設(shè)置選擇行為。
- selectionBehavior() -> QAbstractItemView.SelectionBehavior:獲取選擇行為。
- setSelectionMode(QAbstractItemView.SelectionMode):設(shè)置選擇模式。
- selectionMode() -> QAbstractItemView.SelectionMode:獲取選擇模式。
- setEditTriggers(QAbstractItemView.EditTrigger):設(shè)置編輯觸發(fā)器。
- editTriggers() -> QAbstractItemView.EditTrigger:獲取編輯觸發(fā)器。
- setToolTip(str):設(shè)置工具提示文本。
- toolTip() -> str:獲取工具提示文本。
- setStatusTip(str):設(shè)置狀態(tài)欄提示文本。
- statusTip() -> str:獲取狀態(tài)欄提示文本。
- selectRow(int):選擇指定行。
- selectColumn(int):選擇指定列。
- clearSelection():清除選擇。
- selectAll():全選。
- selectedIndexes() -> List[QModelIndex]:獲取所有選中的索引。
- resizeColumnsToContents():根據(jù)內(nèi)容調(diào)整列寬。
- resizeRowsToContents():根據(jù)內(nèi)容調(diào)整行高。
- hideColumn(int):隱藏指定列。
- showColumn(int):顯示指定列。
- hideRow(int):隱藏指定行。
- showRow(int):顯示指定行。
4. 詳細(xì)示例
設(shè)置模型
# 創(chuàng)建模型 model = QStandardItemModel(4, 3) # 4行3列 model.setHorizontalHeaderLabels(['姓名', '年齡', '職業(yè)']) # 添加數(shù)據(jù) 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('醫(yī)生')) model.setItem(3, 0, QStandardItem('趙六')) model.setItem(3, 1, QStandardItem('30')) model.setItem(3, 2, QStandardItem('律師')) # 設(shè)置模型到視圖 table_view.setModel(model)
獲取當(dāng)前選中的索引
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()
根據(jù)內(nèi)容調(diào)整列寬和行高
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) # 禁用排序
設(shè)置選擇行為
table_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) # 選擇整行 table_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectColumns) # 選擇整列 table_view.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectItems) # 選擇單元格
設(shè)置選擇模式
table_view.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) # 單選 table_view.setSelectionMode(QAbstractItemView.SelectionMode.ContiguousSelection) # 連續(xù)多選 table_view.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection) # 擴(kuò)展多選 table_view.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection) # 多選
設(shè)置編輯觸發(fā)器
table_view.setEditTriggers(QAbstractItemView.EditTrigger.DoubleClicked | QAbstractItemView.EditTrigger.SelectedClicked) # 雙擊或選中后點(diǎn)擊編輯
設(shè)置工具提示和狀態(tài)欄提示
table_view.setToolTip("這是一個(gè)表格視圖") table_view.setStatusTip("查看和編輯數(shù)據(jù)")
5. 信號(hào)與槽機(jī)制
QTableView
支持多種信號(hào),這些信號(hào)可以在用戶交互時(shí)發(fā)射。常見的信號(hào)包括 clicked
、doubleClicked
、pressed
、activated
和 selectionChanged
。你可以通過連接這些信號(hào)到槽函數(shù)來處理用戶的輸入事件。
def on_clicked(index): row = index.row() column = index.column() value = index.data() print(f"點(diǎn)擊: 行: {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("選擇發(fā)生變化") 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. 自定義樣式
除了使用內(nèi)置的樣式設(shè)置外,你還可以通過樣式表(QSS)來自定義 QTableView
的外觀。樣式表類似于CSS,提供了強(qiáng)大的樣式控制能力。
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. 動(dòng)態(tài)更新和控制
你可以動(dòng)態(tài)地更新 QTableView
的內(nèi)容,或者根據(jù)某些條件控制其行為。例如,在定時(shí)器或其他事件觸發(fā)時(shí)更新表格的數(shù)據(jù)。
import time from PyQt6.QtCore import QTimer class MyWindow(QWidget): def __init__(self): super().__init__() self.setWindowTitle("我的應(yīng)用程序") self.setGeometry(100, 100, 800, 600) # 初始化UI self.initUI() # 創(chuàng)建定時(shí)器 self.timer = QTimer(self) self.timer.timeout.connect(self.update_table_view) self.timer.start(5000) # 每5秒觸發(fā)一次 def initUI(self): layout = QVBoxLayout() # 創(chuàng)建表格視圖 self.table_view = QTableView(self) # 創(chuàng)建模型 self.model = QStandardItemModel(4, 3) # 4行3列 self.model.setHorizontalHeaderLabels(['姓名', '年齡', '職業(yè)']) # 添加數(shù)據(jù) 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('醫(yī)生')) self.model.setItem(3, 0, QStandardItem('趙六')) self.model.setItem(3, 1, QStandardItem('30')) self.model.setItem(3, 2, QStandardItem('律師')) # 設(shè)置模型到視圖 self.table_view.setModel(self.model) # 添加到布局 layout.addWidget(self.table_view) self.setLayout(layout) def update_table_view(self): # 更新模型數(shù)據(jù) self.model.clear() self.model.setHorizontalHeaderLabels(['姓名', '年齡', '職業(yè)']) # 添加新的數(shù)據(jù) 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('醫(yī)生')) 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()
總結(jié)
QTableView
是 PyQt6/PySide6 中非常強(qiáng)大且靈活的控件,適用于各種需要展示和編輯表格數(shù)據(jù)的場(chǎng)景。通過設(shè)置不同的屬性和使用樣式表,你可以創(chuàng)建出豐富多樣的表格視圖樣式。同時(shí),通過信號(hào)與槽機(jī)制,你可以方便地處理用戶的輸入事件。希望以上內(nèi)容能幫助你更好地理解和運(yùn)用 QTableView
,并能夠根據(jù)具體需求創(chuàng)建出功能豐富且用戶友好的表格視圖控件。
到此這篇關(guān)于PyQt6/PySide6中QTableView類的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)PySide6 QTableView類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python自定義sorted排序?qū)崿F(xiàn)方法詳解
這篇文章主要介紹了Python自定義sorted排序?qū)崿F(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09jupyter安裝失敗的解決,問題出在rust環(huán)境和32位python
文章講述了如何解決在安裝Jupyter Notebook時(shí)遇到的問題,包括安裝Rust和選擇合適的Python版本(64位)來避免兼容性問題2025-02-02pytorch中Schedule與warmup_steps的用法說明
這篇文章主要介紹了pytorch中Schedule與warmup_steps的用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Python實(shí)現(xiàn)將實(shí)體類列表數(shù)據(jù)導(dǎo)出到Excel文件
在數(shù)據(jù)處理和報(bào)告生成中,將實(shí)體類的列表數(shù)據(jù)導(dǎo)出到Excel文件是一項(xiàng)常見任務(wù),Python提供了多種庫(kù)來實(shí)現(xiàn)這一目標(biāo),下面就來跟隨小編一起學(xué)習(xí)一下吧2025-01-01Python+opencv 實(shí)現(xiàn)圖片文字的分割的方法示例
這篇文章主要介紹了Python+opencv 實(shí)現(xiàn)圖片文字的分割的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07淺談pandas篩選出表中滿足另一個(gè)表所有條件的數(shù)據(jù)方法
今天小編就為大家分享一篇淺談pandas篩選出表中滿足另一個(gè)表所有條件的數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-02-02Python+Matplotlib繪制帶有對(duì)角線的散點(diǎn)圖的示例代碼
Matplotlib 是一個(gè)用于繪制二維圖形的 Python 庫(kù),這篇文章主要介紹了Python如何利用Matplotlib繪制帶有對(duì)角線的散點(diǎn)圖,需要的小伙伴可以參考一下2023-06-06