iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0
Python

pythonGUI學習筆記系列 第 15

Day 15: PySide6 表格(QTableWidget) (一) 增刪改查和信號

  • 分享至 

  • xImage
  •  

QTableWidget

  • QTableWidget : 表格元件,類似excel。

QTableWidget 添加元件和增加刪除元素到表格。

  • QTableWidget() : 表格元件。在表格元件 QTableWidget 中,每個單元格的類型都是 QTableWidgetItem。
  • setRowCount(int)setColumnCount(int) : 用來設定表格的行數和列數。下面的範例中,設置了一個擁有 10 rows、5 cloumns的表格。
from PySide6.QtWidgets import QApplication , QWidget , QTableWidget , QVBoxLayout
class Mywindow(QWidget):
    def __init__(self):
        super().__init__()

        #建立一個10*5的表格
        Table = QTableWidget()
        Table.setRowCount(10)
        Table.setColumnCount(5)

        self.resize(600,600)
        layout = QVBoxLayout()
        layout.addWidget(Table)
        self.setLayout(layout)

if __name__ == "__main__":
    app = QApplication([])
    window = Mywindow()
    window.show()
    app.exec()

添加元件

  • setItem(row , column , item) :用來設置單元格的內容,只能放入 QTableWidgetItem 對象。下面是與 enumerate(List) 搭配使用的範例,其中 enumerate(List) 會回傳索引值 index 和對應的列表項目 list[index]
from PySide6.QtWidgets import QApplication , QWidget , QTableWidget , QVBoxLayout ,QTableWidgetItem
class Mywindow(QWidget):
    def __init__(self):
        super().__init__()

        #建立一個10*5的表格
        Table = QTableWidget()
        Table.setRowCount(10)
        Table.setColumnCount(5)
        #添加元素
        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()

添加元素

  • takeItem(row,col) : 用來刪除指定位置的元素。
  • insertRow(row)insertColumn(Column) : 用來在指定的位置插入行或列。

QTableWidget 查找

  • item(index): 取出指定的元素。
  • findItem(str,flag): 查找表格中的元素,可以通過不同的匹配方式進行查找,這需要配合 Qt.MatchFlag 使用。下面的範例選用了 MatchContains,這會在元素內容包含指定文字時進行匹配並列印出結果。
from PySide6.QtWidgets import QApplication , QWidget , QTableWidget , QVBoxLayout ,QTableWidgetItem
from PySide6.QtCore import Qt
class Mywindow(QWidget):
    def __init__(self):
        super().__init__()

        #建立一個2*5的表格
        Table = QTableWidget()
        Table.setRowCount(2)
        Table.setColumnCount(3)

        #添加元素
        data = [["apple","banana",'car'],["dog","car","door"]]
        for rowIndex , row in enumerate(data):
            for columnIndex , item in enumerate(row):
                Table.setItem(rowIndex, columnIndex , QTableWidgetItem(item))

        #查找
        result = Table.findItems("d",Qt.MatchFlag.MatchContains)
        for item in result:
            print(f'第{item.row()}row,第{item.column()}column,內容是{item.text()}')


        self.resize(400,200)
        layout = QVBoxLayout()
        layout.addWidget(Table)
        self.setLayout(layout)

if __name__ == "__main__":
    app = QApplication([])
    window = Mywindow()
    window.show()
    app.exec()

查找

QTableWidget 常用的信號

在 PySide6 中,當元件觸發信號時,會自動將相關參數傳遞給與該信號連接的槽函數。而 QTableWidget 有兩個常用的信號,觸發方式相同,但傳遞的參數不同。

  • cellClicked(row , column) : 當使用者點擊某個單元格時觸發,會將該單元格的 row 和 column 傳遞給槽函數。下面範例中,當點擊某個單元格時,使用 setItem(row, column, item) 將該單元格的內容設為空白。
from PySide6.QtWidgets import QApplication , QWidget , QTableWidget , QVBoxLayout ,QTableWidgetItem
class Mywindow(QWidget):
    def __init__(self):
        super().__init__()

        #建立一個2*5的表格
        self.Table = QTableWidget()
        self.Table.setRowCount(2)
        self.Table.setColumnCount(5)

        #添加元素
        for rowIndex , row in enumerate([["1","2","3","4","5"],["6","7","8","9","10"]]):
            for columnIndex , item in enumerate(row):
                self.Table.setItem(rowIndex, columnIndex , QTableWidgetItem(item))

        #信號
        self.Table.cellClicked.connect(self.ChangeItem)

        self.resize(600,600)
        layout = QVBoxLayout()
        layout.addWidget(self.Table)
        self.setLayout(layout)

    def ChangeItem (self,row,column):
        self.Table.setItem(row,column,QTableWidgetItem(""))

if __name__ == "__main__":
    app = QApplication([])
    window = Mywindow()
    window.show()
    app.exec()
  • cellChanged(row,column) : 當單元格的內容改變時觸發信號。
  • itemClicked(QTableWidgetItem) : 跟 cellActivated(row , column) 一樣當點擊單元格時會觸發信號,只是不同的是它會往槽函數裡傳遞 QTableWidgetItem 。

總結

  • QTableWidget 添加元件和刪除元素
功能 方法
添加表格 QTableWidget()
設定多少row setRowCount(int)
指定位置插入row insertRow(row)
設定多少Column setColumnCount(int)
指定位置插入Column insertColumn(Column)
設定指定表格內容 setItem(row , column , item)
刪除指定元素 takeItem(row,col)
  • QTableWidget 查找
功能 方法
查找元素 findItem(str,flag)
  • QTableWidget 常用的信號
功能 方法
點擊單元格會觸發 cellClicked.connect(function)
當單元格的內容改變時觸發 cellChanged.connect(function)
點擊單元格會觸發 itemClicked.connect(function)

cellClicked(row , column) 是往槽函數傳遞 row 和 column
itemClicked(QTableWidgetItem) 是往槽函數傳遞 QTableWidgetItem


上一篇
Day 14: Pyside6 列表(QListWidget) (二) 排序和常用功能
下一篇
Day 16: PySide6 表格(QTableWidget) (二) 排序和常用功能
系列文
pythonGUI學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言