QTableWidget是常用的显示数据表格控件,是QTableView的子类,它使用标准的数据模型,并且其单元格数据是通过QTableWidgetItem对象来实现的。


QTableWidget类常用方法如下表:

方法

描述

setRowCount(行数)

设置表格行数

setColumnCount(列数)

设置表格列数

setHorizontalHeaderLabels()

设置表格水平标签

setVerticalHeaderLabels()

设置表格垂直标签

setItem(行,列,对象)

在表格中添加控件

horizontalJeader()

获取表头,以便隐藏

rowCount()

获取表格的行数

columnCount()

获取表格的列数

setEditTriggers(参数)

设置表格是否可编辑(QAbstractItemView.EditTrigger.X):

0:NoEditTriggers0No:不能对表格内容进行编辑

1:CurrentChanged1Editing:随时都能对单元格进行修改

2:DoubleClicked2Editing:双击单元格

4:SelectedClicked4Editing:单机已选中的内容

8:EditKeyPress8Editing:当修改键被按下时修改单元格

16:AnyKeyPressed16Editing:按任意键修改单元格

31:AllEditTriggers31Editing:包括以上所有条件

setSelectionBehavior(参数)

设置表格的选择行为(QAbstractItemView.SelectionBehavior.x):

0:SelectItems0Selecting:选中单个单元格

1:SelectRows1Selecting:选中一行

2:SelectColumns2Selecting:选中一列

setTextAlignment(参数)

设置单元格内文字的对齐方式

AlignLeft:沿着单元格的左边缘对齐

AlignRight:沿着单元格的右边缘对齐

AlignHCenter:剧中显示在水平方向上

AlignJustify:在可用空间中对齐,默认是从左往右

AlignTop:与顶部对齐

AlignBottom:与底部对齐

AlignVCenter:在可用空间中,居中显示在垂直方向上

AlignBaseline:与基线对齐

setSpan(行,列,合并行数,合并列数)

合并单元格

setShowGrid()

在默认情况下(True),表格显示网格线

setColumnWidth(列,宽度)

设置单元格列的宽度

setRowHeight(行,高度)

设置单元格行的高度

接下来用一个案例来学习一下表格QTableWidget控件的使用,先展示基本的效果:


入门 PyQt6 看过来(案例)18~ 表格属性_Qt

1 创建QTableWidget对象,设置表格为6行4列。

tableWidget=QTableWidget(6,4)
  • 1.

不过也可以对QTableWidget对象分别设置行和列:

tableWidget=QTableWidget()
tableWidget.setRowCount(6)
tableWidget.setColumnCount(4)
  • 1.
  • 2.
  • 3.

2 设置表头标签

设置表格水平表头标:

tableWidget.setHorizontalHeaderLabels(['课程编号','课程名','学时','学分'])
  • 1.

如果想设置垂直表头标签的话,需要使用下列代码,如果不设置垂直表头,默认是1,2,3...:

tableWidget.setVerticalHeaderLabels(['A','B','C','D','E','F'])
  • 1.


入门 PyQt6 看过来(案例)18~ 表格属性_pyqt6_02

设置后变成了A,B,C,D,E,F。

对于水平方向的表头,采用以下代码进行隐藏:

tableWidget.horizontalHeader().setVisible(False)
  • 1.


入门 PyQt6 看过来(案例)18~ 表格属性_pyqt_03

对于垂直方向的表头,采用下列代码进行隐藏:

tableWidget.verticalHeader().setVisible(False)
  • 1.


入门 PyQt6 看过来(案例)18~ 表格属性_开发语言_04

3 创建QTableWidgetItem

创建QTableWidgetItem对象,赋值并加载到表格的第0行0、1、2、3列。

newItem=QTableWidgetItem("1A001")
        tableWidget.setItem(0,0,newItem)
        newItem=QTableWidgetItem("C++")
        tableWidget.setItem(0,1,newItem)
        newItem=QTableWidgetItem("120")
        tableWidget.setItem(0,2,newItem)
        newItem=QTableWidgetItem("6")
        tableWidget.setItem(0,3,newItem)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

4 表格只读设置

如果想让表格只读,可以执行下列代码:

tableWidget.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
  • 1.

5 表格自适应

使用下列函数设置表格为自适应的伸缩模式,即可根据窗口大小来改变单元格大小。

tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
  • 1.


入门 PyQt6 看过来(案例)18~ 表格属性_pyqt6_05

6 设置表格选中整行

表格默认选中的是单个单元格,通过下列代码可以设置成选中整行:

tableWidget.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
  • 1.


入门 PyQt6 看过来(案例)18~ 表格属性_开发语言_06


7 设置单元格的宽度、高度与所显示内容的宽度高度相匹配

tableWidget.resizeColumnsToContents()
tableWidget.resizeRowsToContents()
  • 1.
  • 2.


入门 PyQt6 看过来(案例)18~ 表格属性_Qt_07

完整代码如下:

# -*- coding:utf-8 -*-
"""
------------------------------------------------
File Name: 基本表格.py
Description:
Author: lzq
date:2024-07-31 22:08
------------------------------------------------
"""
import sys
from PyQt6.QtWidgets import QDialog, QPushButton, QVBoxLayout, QApplication, QWidget, QTableWidget, QTableWidgetItem, \
    QHBoxLayout, QAbstractItemView, QHeaderView


class MyWidget(QWidget):
    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)
        self.setWindowTitle("QTableWidget测试")
        self.resize(450,350)
        tableWidget=QTableWidget(6,4)
        tableWidget.setHorizontalHeaderLabels(['课程编号','课程名','学时','学分'])
        tableWidget.setVerticalHeaderLabels(['A','B','C','D','E','F'])
        #设置表头不显示
        # tableWidget.horizontalHeader().setVisible(False)
        # tableWidget.verticalHeader().setVisible(False)
        #表格只读
        # tableWidget.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
        #自适应表格页面
        # tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
        #选中一行
        # tableWidget.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
        #设置单元格的宽度、高度与所显示内容的宽度高度相匹配
        tableWidget.resizeColumnsToContents()
        tableWidget.resizeRowsToContents()

        newItem=QTableWidgetItem("1A001")
        tableWidget.setItem(0,0,newItem)
        newItem=QTableWidgetItem("C++")
        tableWidget.setItem(0,1,newItem)
        newItem=QTableWidgetItem("120")
        tableWidget.setItem(0,2,newItem)
        newItem=QTableWidgetItem("6")
        tableWidget.setItem(0,3,newItem)

        hLayout=QHBoxLayout()
        hLayout.addWidget(tableWidget)
        self.setLayout(hLayout)

if __name__=='__main__':
    app = QApplication(sys.argv)
    w = MyWidget()
    w.show()
    sys.exit(app.exec())
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.

8 在表格中快速定位到指定行

遍历表格查找匹配的单元格的方法:

item=self.tableWidget.findItems(text,QtCore.Qt.MatchExactly)
  • 1.

获取匹配的单元格行号:

row=item[0].row()
  • 1.

滚动到指定行以便在界面中可见:

self.tableWidget.verticalScrollBar().setSliderPosition(row)
  • 1.
详细实现代码如下:
# -*- coding:utf-8 -*-
"""
------------------------------------------------
File Name: 快速定位单元格.py
Description:
Author: lzq
date:2024-07-31 22:44
------------------------------------------------
"""
import sys

from PyQt6 import QtCore
from PyQt6.QtGui import QFont, QBrush, QColor
from PyQt6.QtWidgets import QDialog, QPushButton, QVBoxLayout, QApplication, QWidget, QTableWidget, QTableWidgetItem, \
    QHBoxLayout


class MyWidget(QWidget):
    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)
        self.initUI()
    def initUI(self):
        self.setWindowTitle("")
        self.resize(400, 300)
        #创建QTableWidget表格:10行2列
        tableWidget=QTableWidget()
        tableWidget.setRowCount(10)
        tableWidget.setColumnCount(2)
        #列变量存放10个元组数据项,每个元组包含课程名和学分项
        list=[('计算机导论',1),('PyQt6基础教程',2),('高等数学',2),('大学英语',3),
              ('C++',2),('数据结构',2),('Java',3),('操作系统',2),
              ('软件工程',4),('计算机网络',4)]
        #分别用每一个列表项元组0项和1项作为数据创建QTableWidgetItem对象
        #然后设置为表格的单元格的第0个和第1个元素
        for i in range(10):
            tableWidget.setItem(i,0,QTableWidgetItem(list[i][0]))
            tableWidget.setItem(i,1,QTableWidgetItem(str(list[i][1])))

        layout=QHBoxLayout()
        layout.addWidget(tableWidget)
        self.setLayout(layout)
        #查找对应的单元格,查找内容是text变量中的字符串
        text='PyQt6基础教程'
        items=tableWidget.findItems(text,QtCore.Qt.MatchFlag.MatchExactly)
        item=items[0]
        #设置定位的单元格的文本字体和颜色
        item.setFont(QFont("黑体",14))
        item.setForeground(QBrush(QColor(255,0,0)))
        #滚动到定位的单元格
        row=item.row()
        tableWidget.verticalScrollBar().setSliderPosition(row)

if __name__=='__main__':
    app = QApplication(sys.argv)
    w = MyWidget()
    w.show()
    sys.exit(app.exec())
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.

查询出来的结果是PyQt6基础教程,红色黑体


入门 PyQt6 看过来(案例)18~ 表格属性_pyqt6_08

本文至此结束,欢迎大家阅读,感谢大家点赞关注!