QTableWidget的一些常用方法
下面兩個類可以根據自己的情況自定義。
單元格類型的類:
class CellType(Enum): ctKey = 1000 ctPath = 1001 ctInfo = 1002
單元格列的類:
class FieldColNum(Enum): colKey = 0 colPath = 1 colInfo = 2
一、設置TableWidget的表頭
headerItem = QTableWidgetItem("要寫入單元格里的內容") self.ui.tableWidget.setHorizontalHeaderItem(列數序號, headerItem)
二、設置TableWidget行數
self.ui.tableWidget.setRowCount(行數)
三、設置TableWidget單元格內容
item = QTableWidgetItem("單元格內容", 單元格類型) # CellType.ctKey.value self.ui.tableWidget.setItem(行序號, 列序號, item)
四、插入、添加、刪除
curRow = self.ui.tableWidget.currentRow() # 當前行號 self.ui.tableWidget.insertRow(curRow) # 插入行 curRow = self.ui.tableWidget.rowCount() self.ui.tableWidget.insertRow(curRow) # 添加行 curRow = self.ui.tableWidget.currentRow() # 當前行號 self.ui.tableWidget.removeRow(curRow) # 刪除行
五、自動調整行高、自動調整列寬
self.ui.tableWidget.resizeRowsToContents() # 自動調整行高 self.ui.tableWidget.resizeColumnsToContents() # 自動調整列寬
六、是否可編輯
self.ui.tableWidget.setEditTriggers(QAbstractItemView.DoubleClicked | QAbstractItemView.SelectedClicked) # 可編輯 self.ui.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) # 不可編輯
七、是否顯示行表頭,是否顯示列表頭。True代表是,False代表不顯示
self.ui.tableWidget.horizontalHeader().setVisible(True) # 顯示行表頭 self.ui.tableWidget.verticalHeader().setVisible(True) # 顯示列表頭
八、行選擇、單元格選擇
self.ui.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows) # 行選擇 self.ui.tableWidget.setSelectionBehavior(QAbstractItemView.SelectItems) # 單元格選擇
九、清空表格內容
self.ui.tableWidget.clearContents()
十、讀取單元格內容
item = self.ui.tableWidget.item(行序號, 列序號) content = item.text() # 獲取單元格內容 status = item.checkState() # 獲取單元格狀態,Qt.Checked或者Qt.Unchecked
十一、間隔行變色
self.ui.tableWidget.setAlternatingRowColors(True) # 變色
self.ui.tableWidget.setStyleSheet("alternate-background-color: rgb(197, 197, 197);")
十二、設置列寬。參考鏈接:https://blog.csdn.net/baidu_37503452/article/details/104225719
self.ui.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.ui.tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.Interactive)
十三、在一個單元格中插入一個button
btn_path_select = QPushButton("...") self.ui.tableWidget.setCellWidget(j, 1, btn_path_select)
效果圖:
十四、在一個單元格中插入兩個控件
label_path_select = QLabel(“\路徑\test.py”) btn_path_select = QPushButton("...") btn_path_select.setMaximumWidth(40) cell_widget = QWidget() box_layout = QHBoxLayout(cell_widget) box_layout.addWidget(label_path_select) box_layout.addWidget(btn_path_select) box_layout.setContentsMargins(0, 0, 0, 0) self.ui.tableWidget.setCellWidget(j, 1, cell_widget)
效果圖:
十五、設置單元格中button按鈕的單擊事件
def do_btn_path_select_clicked(self): sender_obj = self.sender() cell_widget = sender_obj.parent() # print(cell_widget.children()[1])
cell_idx = self.ui.tableWidget.indexAt(QPoint(cell_widget.frameGeometry().x(), cell_widget.frameGeometry().y()))
cell_row = cell_idx.row()
cell_column = cell_idx.column()
# 單元格的行和列
print(cell_row, cell_column)
if sender_obj is None: pass else: idx = self.ui.tableWidget.indexAt(QPoint(sender_obj.frameGeometry().x(), sender_obj.frameGeometry().y()))
# button的行和列 row = idx.row() column = idx.column() if column == 1: filename, flt = QFileDialog.getOpenFileName(self, "選擇一個或多個文件", "", "All Files (*);;Text Files (*.txt)") cell_widget.children()[1].setText(filename)
效果圖:
十六、設置QTableWidget的單擊事件
def do_table_widget_clicked(self, index): table_column = index.column() table_row = index.row() # current_item = self.ui.tableWidget.item(table_row, table_column) current_widget = self.ui.tableWidget.cellWidget(table_row, table_column) path_label_obj = current_widget.children()[1] path_button_obj = current_widget.children()[2] # print(path_label_obj.text()) path_label_obj.setText("已單擊此單元格")
效果圖:
十七、單擊單元格cellWidget事件
def do_table_widget_cell_clicked(self, row, column): current_widget = self.ui.tableWidget.cellWidget(row, column) path_label_obj = current_widget.children()[1] path_label_obj.setText("已單擊此單元格")
效果圖同十六是一樣的。
關於TableWidget的一些基本設置說完了以后,下面就了解一下可能值得注意的點。
首先,關於splitter的比例問題。在右側,QTableWidget和QPlainTextEdit兩個組件剛布局為splitter時,兩個的比例是1:1,如果想要按照自己的比例調整大小,怎么辦呢。
先選中QTableWidget,在其屬性那里找到Vertical Stretch屬性,這里設置為6,同樣,選中QPlainTextEdit,在其屬性里找到那個屬性,設置為4。那么這兩個控件高度的比例就為6:4了。
第二個就是關於那個隔行變色的功能了,原始的是白色和灰色,效果並不明顯,所以我自己修改了顏色,對比度更大一點。
找到styleSheet屬性,點擊右邊的那三個點。
選擇Add Color --》alternate-background-color,然后選擇一個自己喜歡的顏色就好了。