QtWidgets.QTableWidget表格控件的用法

393 阅读3分钟

1、创建表格控件,设置表格控件的位置和长宽以及对象名称。

self.tableWidget = QtWidgets.QTableWidget(self.tab)
self.tableWidget.setGeometry(QtCore.QRect(50, 130, 1211, 381))
self.tableWidget.setObjectName("tableWidget")

2、设置表格的水平标题头、垂直标题头,并设置列名

通过setColumnCount函数设置列数,然后给每一列的列名添加表项,表项通常可以包含文本、图标、复选框等。

QtCore.QCoreApplication.translate是一个用于语言国际化的函数,它可以将传入的字符串转换为当前系统的语言。

# 设置列数
self.tableWidget.setColumnCount(12)# 设置垂直标题头
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(0, item)
# 设置水平标题头
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(6, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(7, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(8, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(9, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(10, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(11, item)
# 语言国际化转换函数
_translate = QtCore.QCoreApplication.translate
# 给第一个垂直标题头设置序号
item = self.tableWidget.verticalHeaderItem(0)
item.setText(_translate("MainWindow", "1"))
# 给每一个水平标题头设置名称
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "ID"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "任务名称"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "占阶段内比重"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "责任人"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "完成进度"))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(_translate("MainWindow", "预估耗时(H)"))
item = self.tableWidget.horizontalHeaderItem(6)
item.setText(_translate("MainWindow", "实际耗时(H)"))
item = self.tableWidget.horizontalHeaderItem(7)
item.setText(_translate("MainWindow", "计划开始时间"))
item = self.tableWidget.horizontalHeaderItem(8)
item.setText(_translate("MainWindow", "计划完成时间"))
item = self.tableWidget.horizontalHeaderItem(9)
item.setText(_translate("MainWindow", "实际开始时间"))
item = self.tableWidget.horizontalHeaderItem(10)
item.setText(_translate("MainWindow", "实际完成时间"))
item = self.tableWidget.horizontalHeaderItem(11)
item.setText(_translate("MainWindow", "文档链接"))

3、添加一行,并充填这行数据

def set_table_data_by_result(self,result):
    # 1、清除表格中原有的数据
    while self.tableWidget.rowCount() >0:
        self.tableWidget.removeRow(0)
    # 2、添加数据到表格里
    for data in result:
        # 向表格中插入一行
        self.tableWidget.insertRow(self.tableWidget.rowCount())
        # 获取最新的行数
        row_num=self.tableWidget.rowCount()
        # 由于表格的第一行行号是0,所以设置这行的数据时,需要在行数减1的那行设置
        self.fill_row_data(row_num-1,data) 
def fill_row_data(self,row_num,data):
    _translate = QtCore.QCoreApplication.translate
    # 获取表格是否开启了排序
    __sortingEnabled = self.tableWidget.isSortingEnabled()
    # 插入一行数据的时候,先将排序关闭,防止自动排序影响了插入的数据位置
    self.tableWidget.setSortingEnabled(False)
    self.tableWidget.setItem(row_num, 0, QtWidgets.QTableWidgetItem())
    item = self.tableWidget.item(row_num, 0)
    item.setText(_translate("MainWindow", str(data.id)))
    self.tableWidget.setItem(row_num, 1, QtWidgets.QTableWidgetItem())
    item = self.tableWidget.item(row_num, 1)
    item.setText(_translate("MainWindow", str(data.task_name)))
    self.tableWidget.setItem(row_num, 2, QtWidgets.QTableWidgetItem())
    item = self.tableWidget.item(row_num, 2)
    item.setText(_translate("MainWindow", str(data.weight)))
    self.tableWidget.setItem(row_num, 3, QtWidgets.QTableWidgetItem())
    item = self.tableWidget.item(row_num, 3)
    item.setText(_translate("MainWindow", str(data.persion_name)))
    self.tableWidget.setItem(row_num, 4, QtWidgets.QTableWidgetItem())
    item = self.tableWidget.item(row_num, 4)
    item.setText(_translate("MainWindow", str(data.finish_process)))
    self.tableWidget.setItem(row_num, 5, QtWidgets.QTableWidgetItem())
    item = self.tableWidget.item(row_num, 5)
    item.setText(_translate("MainWindow", str(data.eval_time)))
    self.tableWidget.setItem(row_num, 6, QtWidgets.QTableWidgetItem())
    item = self.tableWidget.item(row_num, 6)
    item.setText(_translate("MainWindow", str(data.real_time)))
    self.tableWidget.setItem(row_num, 7, QtWidgets.QTableWidgetItem())
    item = self.tableWidget.item(row_num, 7)
    item.setText(_translate("MainWindow", time_tostr(data.plan_start_time)))
    self.tableWidget.setItem(row_num, 8, QtWidgets.QTableWidgetItem())
    item = self.tableWidget.item(row_num, 8)
    item.setText(_translate("MainWindow", time_tostr(data.plan_end_time)))
    self.tableWidget.setItem(row_num, 9, QtWidgets.QTableWidgetItem())
    item = self.tableWidget.item(row_num, 9)
    item.setText(_translate("MainWindow", time_tostr(data.real_start_time)))
    self.tableWidget.setItem(row_num, 10, QtWidgets.QTableWidgetItem())
    item = self.tableWidget.item(row_num, 10)
    item.setText(_translate("MainWindow", time_tostr(data.real_end_time)))
    self.tableWidget.setItem(row_num, 11, QtWidgets.QTableWidgetItem())
    item = self.tableWidget.item(row_num, 11)
    item.setText(_translate("MainWindow", str(data.docpath)))
    # 数据插入完成后,再将排序恢复到之前的状态
    self.tableWidget.setSortingEnabled(__sortingEnabled)

4、自定义列宽

比如将第12列的列宽设置为450,第1列是0

self.tableWidget.setColumnWidth(11, 450)

5、禁止编辑某一列

比如设置第12列禁止编辑

class EmptyDelegate(QtWidgets.QItemDelegate):
    def __init__(self, parent):
        super(EmptyDelegate, self).__init__(parent)

    def createEditor(self, QWidget, QStyleOptionViewItem, QModelIndex):
        return None

self.tableWidget.setItemDelegateForColumn(11, EmptyDelegate(self))

6、禁止拖动某一列的列宽

比如禁止拖动第12列的列宽

self.tableWidget.horizontalHeader().setSectionResizeMode(11, QtWidgets.QHeaderView.Fixed)

7、设置某一列居中对齐

class AlignDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super(AlignDelegate, self).initStyleOption(option, index)
        option.displayAlignment = QtCore.Qt.AlignCenter

# 设置某一列单元格对齐方式为居中对齐
self.tableWidget.setItemDelegateForColumn(1, AlignDelegate(self.tableWidget))

8、将某一列隐藏起来

# 隐藏某一列,将第1列隐藏起来,由于第1列是用于更新数据的ID,不需要展示出来
self.tableWidget.setColumnHidden(0,True)

9、设置某一列的列宽随内容自适应

比如设置第1列的列宽随内容自适应

# 设置某一列的列宽随内容自动分配。
self.tableWidget.horizontalHeader().setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents)

10、给单元格绑定单击事件的处理函数

# 给单元格单击绑定槽函数
self.tableWidget.itemClicked.connect(self.table_cell_notebook)

def table_cell_notebook(self):
    pass

11、获取选中的单元格

def table_cell_notebook(self):
    # 获取选中的单元格,这个函数返回了选中的单元格表项的列表,经过试验,这个列表里只有一个表项
    items=self.tableWidget.selectedItems()
    if len(items)>1 or len(items)==0:
        return
    # 得到选中的单元格表项所在的行号和列号
    current_row=items[0].row()
    current_column=items[0].column()

12、获取单元格表项的内容

第一个单元格,行号是0,列号也是0

id=self.tableWidget.item(current_row,0).text()

13、给单元格表项设置新的值

# 重新给这个单元格添加一个表项,如果已经有了可以不用添加
self.tableWidget.setItem(current_row, 11, QtWidgets.QTableWidgetItem())
# 获取这个单元格内的表项
item = self.tableWidget.item(current_row, 11)
# 给这个表项设置新的内容
item.setText(str(docpath))

14、获取表格中的行数

row_counts=self.tableWidget.rowCount()

15、获取表格中的列数

self.tableWidget.columnCount()