QTableWidget 排序
-
setSortingEnabled(bool)
: 設定是否開啟排序
from PySide6.QtWidgets import QApplication , QWidget , QTableWidget , QVBoxLayout ,QTableWidgetItem , QHeaderView
class Mywindow(QWidget):
def __init__(self):
super().__init__()
#建立一個10*5的表格
Table = QTableWidget()
Table.setRowCount(5)
Table.setColumnCount(5)
#啟用表格排序
Table.setSortingEnabled(True)
#添加元素
for rowIndex , row in enumerate(["3","2","5","4","1"]):
for columnIndex , item in enumerate(row):
Table.setItem(rowIndex, columnIndex , QTableWidgetItem(item))
self.resize(600,600)
layout = QVBoxLayout()
layout.addWidget(Table)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication([])
window = Mywindow()
window.show()
app.exec()
QTableWidget 常用的功能
-
setHorizontalHeaderLabels([str])
or setVerticalHeaderLabels([str])
: 用來設置水平或垂直的表頭標籤。
from PySide6.QtWidgets import QApplication , QWidget , QTableWidget , QVBoxLayout ,QTableWidgetItem
class Mywindow(QWidget):
def __init__(self):
super().__init__()
#建立一個10*5的表格
Table = QTableWidget()
Table.setRowCount(5)
Table.setColumnCount(5)
#設置表頭
Table.setHorizontalHeaderLabels(["colume1","colume2","colume3","colume4","colume5"])
Table.setVerticalHeaderLabels(["row1","row2","row3","row4","row5"])
#添加元素
data = [[str(i) for i in range(5)],[str(i) for i in range(5,10)]]
for rowIndex , row in enumerate(data):
for columnIndex , item in enumerate(row):
Table.setItem(rowIndex, columnIndex , QTableWidgetItem(item))
self.resize(600,600)
layout = QVBoxLayout()
layout.addWidget(Table)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication([])
window = Mywindow()
window.show()
app.exec()
-
horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode)
: 用來設置表頭的列寬自動調整方式,通常會配合 QHeaderView.ResizeMode
使用,常用的有兩種
功能 |
方法 |
將所有列平分可用空間。 |
QHeaderView.ResizeMode.Stretch |
根據每列的內容自動調整列寬。 |
QHeaderView.ResizeMode.ResizeToContents |
下面範例是使用 ResizeToContents 來作範例。
from PySide6.QtWidgets import QApplication , QWidget , QTableWidget , QVBoxLayout ,QTableWidgetItem , QHeaderView
class Mywindow(QWidget):
def __init__(self):
super().__init__()
#建立一個10*5的表格
Table = QTableWidget()
Table.setRowCount(5)
Table.setColumnCount(5)
#設置表頭
Table.setHorizontalHeaderLabels(["colume1","colume2","colume3","colume4","colume5"])
Table.setVerticalHeaderLabels(["row1","row2","row3","row4","row5"])
#設置表頭伸縮
Table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents) #如果窗口還有空間,會把它填滿。
#添加元素
for rowIndex , row in enumerate([["111111111111111111111","2","3","444444444","5"],["6666666666666","","8","9999999999","10"]]):
for columnIndex , item in enumerate(row):
Table.setItem(rowIndex, columnIndex , QTableWidgetItem(item))
self.resize(600,600)
layout = QVBoxLayout()
layout.addWidget(Table)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication([])
window = Mywindow()
window.show()
app.exec()
-
setEditTriggers(QAbstractItemView.EditTrigger)
: 設置編輯觸發條件。有三種選擇。
觸發功能 |
方法 |
禁止編輯 |
QAbstractItemView.EditTrigger.NoEditTriggers |
雙擊觸發編輯 |
QAbstractItemView.EditTrigger.DoubleClicked |
允許所有編輯 |
QAbstractItemView.EditTrigger.AllEditTriggers |
-
setSpan(int row, int column, int rowSpan, int columnSpan)
:合併指定的行列範圍。
from PySide6.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget
class MyWindow(QWidget):
def __init__(self):
super().__init__()
# 創建一個 5x5 的表格
Table = QTableWidget()
Table.setRowCount(5)
Table.setColumnCount(5)
# 填充數據
for row in range(5):
for col in range(5):
item = QTableWidgetItem(f"Item {row},{col}")
Table.setItem(row, col, item)
# 合併 (1,1) 到 (2,2) 的單元格 (2行2列範圍)
Table.setSpan(1, 1, 2, 2)
layout = QVBoxLayout()
layout.addWidget(Table)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication([])
window = MyWindow()
window.show()
app.exec()
-
item(row,col)
: 用來獲取指定位置的 TableWidgetItem
。
-
setText(str)
: 設置 QTableWidgetItem 的內容。
-
selectedItems()
: 返回所有被選中的 QTableWidgetItem 的列表。
-
setBackground(Qt.GlobalColor)
: 設置 QTableWidgetItem
的背景顏色,使用 Qt.GlobalColor 來指定顏色。
下面範例是當點擊按鈕時,會把所有選中的單元格,背景顏色改為紅色,並把文字內容改成紅色兩字
from PySide6.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget ,QPushButton
from PySide6.QtCore import Qt
class MyWindow(QWidget):
def __init__(self):
super().__init__()
#建立按鈕
Btn = QPushButton("改變顏色")
# 創建一個 5x5 的表格
self.Table = QTableWidget()
self.Table.setRowCount(5)
self.Table.setColumnCount(5)
# 填充數據
for row in range(5):
for col in range(5):
item = QTableWidgetItem(f"Item {row},{col}")
self.Table.setItem(row, col, item)
#觸發信號
Btn.clicked.connect(self.ChnColor)
#布局
layout = QVBoxLayout()
layout.addWidget(self.Table)
layout.addWidget(Btn)
self.setLayout(layout)
def ChnColor(self) :
for item in self.Table.selectedItems() :
self.Table.item(item.row() , item.column()).setText("紅色")
self.Table.item(item.row() , item.column()).setBackground(Qt.GlobalColor.red)
if __name__ == "__main__":
app = QApplication([])
window = MyWindow()
window.show()
app.exec()
#總結
功能 |
方法 |
設定排序 |
setSortingEnabled(bool) |
功能 |
方法 |
設置水平的表頭 |
setHorizontalHeaderLabels([str]) |
設置垂直的表頭 |
setVerticalHeaderLabels([str]) |
調整表格列寬 |
horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode) |
設置編輯觸發條件 |
setEditTriggers(QAbstractItemView.EditTrigger) |
合併指定行列 |
setSpan(int row, int column, int rowSpan, int columnSpan) |
獲取指定TableWidgetItem |
item(row,col) |
設置TableWidgetItem內容文字 |
setText(str) |
返回所有選重的表格 |
selectedItems() |
設置表格背景 |
setBackground(Qt.GlobalColor) |