iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0
Python

pythonGUI學習筆記系列 第 16

Day 16: PySide6 表格(QTableWidget) (二) 排序和常用功能

  • 分享至 

  • xImage
  •  

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()

#總結

  • QTableWidget 排序
功能 方法
設定排序 setSortingEnabled(bool)
  • QTableWidget 常用的功能
功能 方法
設置水平的表頭 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)

上一篇
Day 15: PySide6 表格(QTableWidget) (一) 增刪改查和信號
下一篇
Day17: PySide6 對話框(QMessageBox)
系列文
pythonGUI學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言