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
支持多種信號,這些信號可以在用戶交互時發射。常見的信號包括 clicked
、doubleClicked
、pressed
、activated
和 selectionChanged
。你可以通過連接這些信號到槽函數來處理用戶的輸入事件。
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
,并能夠根據具體需求創建出功能豐富且用戶友好的表格視圖控件。