锋哥原创的PyQt6视频教程:
PyQt6提供了两种表格控件,分别是TableWidget和TableView,其中,TableView是基于模型的,它是TableWidget的父类,使用TableView时,首先需要建立模型,然后再保存数据;而TableWidget是TableView的升级版本,它已经内置了一个数据存储模型QTableWidgetItem,我们在使用时,不必自己建立模型,而直接使用setItem()方法即可添加数据。所以在实际开发时,推荐使用TableWidget控件作为表格。
由于QTableWidget类继承自QTableView,因此,它具有QTableView的所有公共方法,另外,它还提供了一些自身特有的方法。
QTableWidget类的常用方法:
方法 | 说明 |
---|---|
setRowCount() | 设置表格的行数 |
setColumnCount() | 设置表格的列数 |
setHorizontalHeaderLabels() | 设置表格中的水平标题名称 |
setVerticalHeaderLabels() | 设置表格中的垂直标题名称 |
setltem() | 设置每个单元格中的内容 |
setCellWidget() | 设置单元格的内容为QWidget控件 |
resizeColumnsToContents() | 使表格的列的宽度跟随内容改变 |
resizeRowsToContents() | 使表格的行的高度跟随内容改变 |
setEditTriggers() | 设置表格是否可以编辑,取值如下。 QAbstractltem View.NoEditTriggers0No:不能编辑表格内容; QAbstractItemView.CurrentChanged1Editing:允许对单元格进行编辑; QAbstractItemView.DoubleClicked2Editing:双击时可以编辑单元格; QAbstractItemView.SelectedClicked4Editing:单击时可以编辑单元格; QAbstractItemView.EditKeyPressed8Editing:按修改键时可以编辑单元格; QAbstractItemView.AnyKeyPressed16Editing:按任意键都可以编辑单元格 |
setSpan() | 合并单元格,该方法的4个参数如下。 row:要改变的单元格的行索引; column:要改变的单元格的列索引; rowSpanCount:需要合并的行数; columnSpanCount:需要合并的列数 |
setShowGrid() | 设置是否显示网格线,默认不显示 |
setSelectionBehavior() | 设置表格的选择行为,取值如下。 QAbstractItemView.SelectItemsOSelecting:选中当前单元格; QAbstractItemView.SelectRows1Selecting:选中整行; QAbstractItem View.DoubleClicked2Editing:选中整列 |
setTextAlignment() | 设置单元格内文字的对齐方式,取值如下。 Qt.AlignLeft:与单元格左边缘对齐; Qt.AlignRight:与单元格右边缘对齐; Qt.AlignHCenter:单元格内水平居中对齐; Qt.AlignJustify:单元格内两端对齐; Qt.AlignTop:与单元格顶部边缘对齐; Qt.AlignBottom:与单元格底部边缘对齐; Ot.Align VCenter:单元格内垂直居中对齐 |
setAlternatingRowColors() | 设置表格颜色交错显示 |
setColumnWidth() | 设置单元格的宽度 |
setRowHeight() | 设置单元格的高度 |
sortItems() | 设置单元格内容的排序方式,取值如下。 Qt.DescendingOrder:降序; Qt.AscendingOrder:升序 |
rowCount() | 获取表格中的行数 |
columnCount() | 获取表格中的列数 |
verticalHeader() | 获取表格的垂直标题头 |
horizontalHeader() | 获取表格的水平标题头 |
QTableWidgetItem类表示QTableWidget中的单元格,一个表格就是由多个单元格组成的。
QTableWidgetItem类的常用方法:
方法 | 说明 |
---|---|
setText() | 设置单元格的文本 |
setCheckState() | 设置指定单元格的选中状态,取值如下。 Qt.Checked:单元格选中; Qt.Unchecked:单元格未选中 |
setIcon() | 为单元格设置图标 |
setBackground() | 设置单元格的背景色 |
setForeground() | 设置单元格内文本的颜色 |
setFont() | 设置单元格内文本的字体 |
text() | 获取单元格的文本 |
如果没学过Pymsql的,可以先学习下:2024 1小时学会 Python操作Mysql数据库之pymysql模块技术(无废话版)_哔哩哔哩_bilibili
先准备sql数据脚本:
CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_pyqt6` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `db_pyqt6`;
/*Table structure for table `t_book` */
DROP TABLE IF EXISTS `t_book`;
CREATE TABLE `t_book` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(100) DEFAULT NULL COMMENT '书名',
`type` varchar(100) DEFAULT NULL COMMENT '图书类别',
`author` varchar(20) DEFAULT NULL COMMENT '作者',
`publishDate` date DEFAULT NULL COMMENT '出版日期',
`price` decimal(6,2) DEFAULT NULL COMMENT '价格',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
/*Data for the table `t_book` */
insert into `t_book`(`id`,`name`,`type`,`author`,`publishDate`,`price`) values (1,'零基础学Python','Python','小明','2022-12-13','30.12'),(2,'Python编程 从入门到实践 第3版','Python','埃里克·马瑟斯','2022-12-12','50.12'),(3,'利用Python进行数据分析(原书第2版)','Python','韦斯·麦金尼','2021-12-12','150.32'),(4,'Python数据分析从入门到实践','Python','高春艳 刘志铭','2020-01-12','100.00'),(5,'Python编程快速上手 让繁琐工作自动化 第2版','Python','阿尔·斯维加特','2019-01-12','44.50');
UI生成代码:
from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(528, 330)
self.tableWidget = QtWidgets.QTableWidget(parent=Form)
self.tableWidget.setGeometry(QtCore.QRect(20, 10, 481, 291))
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(0)
self.tableWidget.setRowCount(0)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
Main测试代码:
"""
python加载ui文件
作者 : 小锋老师
官网 : www.python222.com
"""
import sys
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QPalette, QBrush, QColor, QIcon
from PyQt6.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QAbstractItemView, QComboBox
from PyQt6 import uic
from pymysql import Connection
if __name__ == '__main__':
app = QApplication(sys.argv)
ui = uic.loadUi("./QTableWidget表格控件.ui")
table: QTableWidget = ui.tableWidget
# 创建数据库连接
con = Connection(
host="localhost", # 主机名
port=3306, # 端口
user="root", # 账户
password="123456", # 密码
database="db_pyqt6" # 指定操作的数据库
)
# 获取游标对象
cursor = con.cursor()
# 使用游标对象,执行sql语句
cursor.execute("select * from t_book")
# 获取查询所有结果
result = cursor.fetchall()
row = cursor.rowcount # 获取记录个数,用于设置表格的行数
vol = len(result[0]) # 获取字段数 用于设置表格的列数
con.close()
table.setRowCount(row)
table.setColumnCount(vol)
table.setHorizontalHeaderLabels(['编号', '书名', '类别', '作者', '出版日期', '价格'])
for i in range(row):
for j in range(vol):
if j == 5:
data = QTableWidgetItem(QIcon("rmb.png"), str(result[i][j])) # 在指定列中显示图片
else:
data = QTableWidgetItem(str(result[i][j]))
if j == 2:
comobox = QComboBox()
comobox.addItems(['Python', 'Java', "Go"])
comobox.setCurrentIndex(0)
table.setCellWidget(i, j, comobox)
else:
data.setForeground(QBrush(QColor("red"))) # 设置文本颜色
data.setBackground(QBrush(QColor("yellow"))) # 设置背景颜色
table.setItem(i, j, data)
table.resizeColumnsToContents() # 设置列宽跟随内容改变
table.resizeRowsToContents() # 使行高度跟随内容改变
table.setAlternatingRowColors(True) # 使表格颜色交错显示
table.verticalHeader().setVisible(False) # 隐藏垂直标题 序号
table.horizontalHeader().setStretchLastSection(True) # 设置最后一列自动填充容器
table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers) # 禁止编辑单元格
# table.sortItems(4, Qt.SortOrder.DescendingOrder) # 设置指定列的排序方式
# table.setSpan(2, 4, 2, 2) # 合并指定单元格
ui.show()
sys.exit(app.exec())