(7) フォームコントロールの使用
テーブル コントロールは、行と列の形式でデータを表すことができます。たとえば、チケット情報、給与収入、請求レポート、学生の成績、その他の同様のデータを表示する必要がある場合、通常はテーブルを使用してそれらを表示します。 12306 Web サイトに表示されます。テーブルを使用してチケット情報を表示します。
テーブルはインターフェイスにデータを表示する最も一般的な方法であり、PyQt5 ではテーブル コントロールを表すために TableWidget が使用されます。次に、テーブルコントロールを使ってデータベース内のデータを表示し、内容の自動入力、セルの編集禁止、色の設定、並べ替え、テーブル内の画像の表示、セルの結合などテーブル上の各種操作設定を行う方法を説明します。 、など。
1. TableWidget フォーム コントロール
PyQt5 は、TableWidget と TableView という 2 つのテーブル コントロールを提供します。このうち、TableView はモデルに基づいており、TableWidget の親クラスです。TableView を使用する場合、最初にモデルを構築してからデータを保存する必要があります。TableWidgetはTableView のアップグレード バージョンには、データ ストレージ モデル QTableWidgetItem が組み込まれています。これを使用する場合、自分でモデルを構築する必要はなく、 setItem() メソッドを直接使用してデータを追加します。したがって、実際の開発では、TableWidget コントロールをテーブルとして使用することをお勧めします。
QTableWidget クラスは QTableView を継承しているため、QTableView のすべてのパブリック メソッドを備えており、独自のユニークなメソッドもいくつか提供しています。
TableWidget クラスの一般的なメソッドと説明
方法 | 説明する |
---|---|
setRowCount() | テーブル内の行数を設定します。 |
setColumnCount() | テーブル内の列の数を設定します。 |
sethorizontalheaderlabels() | テーブルの水平ヘッダ名を設定します。 |
setVerticalHeaderLabels() | セルの垂直ヘッダー名を設定します。 |
setItem() | 各セルに内容を設定します。 |
setCellWidget() | セルの内容を QWIDget コントロールとして設定します。 |
sizeColumnsToContents() | 表の列の幅を内容に合わせて変更します。 |
sizeRowsToContents() | 表の行の高さを内容に応じて変更します。 |
setEditTriggers() |
|
setSpan() |
|
setShowGrid() | デフォルトでは表示されないグリッド線を表示するかどうかを設定します。 |
setSelectionBehavior() |
|
setTextAlignment() |
|
setAlternatingRowColors() | テーブルの色を千鳥に設定します。 |
setColumnWidth() | セルの幅を設定します。 |
setRowHeight() | セルの高さを設定します。 |
sortItems() |
|
rowCount() | テーブル内の行数を取得します。 |
列数() | テーブル内の列の数を取得します。 |
垂直ヘッダー() | テーブルの垂直ヘッダーを取得します。 |
horizotalHeader() | テーブルの水平タイトルヘッダーを取得します。 |
QTableWidgetItem クラスは QTableWidget 内のセルを表し、テーブルは複数のセルで構成されます。
QTableWidgetItem クラスの一般的なメソッドと説明
方法 | 説明する |
---|---|
setText() | セルのテキストを設定します。 |
setCheckSate() |
|
setIcon() | セルのアイコンを設定します。 |
setBackground() | セルの背景色を設定します。 |
setForeground() | セル内のテキストの色を設定します。 |
setFont() | セル内のテキストのフォントを設定します。 |
文章() | セルのテキストを取得します。 |
2. データベースのデータを表に表示する
TableWidget コントロールを使用してデータを表示するには、主に QTableWidgetItem クラスを使用します。このクラスを使用してテーブル内にセルを作成し、表示するテキストまたはアイコンを指定した後、TableWidget オブジェクトの setItem() メソッドを使用して追加できます。テーブル。
例: テーブルを使用した MySQL データの表示
创建一个.py文件,导入PyQt5中的相应模块,在该程序中,主要是用PyMySQL模块从数据库中查询数据,并将查到的数据显示在TableWidget表格中。
完整代码如下:
from PyQt5.QtWidgets import *
class Demo(QWidget):
def __init__(self, parent=None):
super(Demo, self).__init__(parent)
self.initUi() # 初始化窗口
def initUi(self):
self.setWindowTitle("使用表格显示数据库中的数据")
self.resize(400, 180) # 设置窗口大小
vhayout = QHBoxLayout() # 创建水平布局
table = QTableWidget() # 创建表格
import pymysql
# 打开数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="mrsoft", charset="utf8")
cursor = db.cursor() # 使用cursor()方法获取操作游标
cursor.execute("select * from books") # 执行SQL语句
result = cursor.fetchall() # 获取所有记录
row = cursor.rowcount # 取得记录个数,用于设置表格的行数
vol = len(result[0]) # 取得字段个数,用于设置表格的列数
cursor.close() # 关闭游标
db.close() # 关闭连接
table.setRowCount(row) # 设置表格行数
table.setColumnCount(vol) # 设置表格列数
table.setHorizontalHeaderLabels(["ID", "图书名称", "图书分类", "图书价格", "出版时间"]) # 设置表格的标题名称
for i in range(row): # 遍历行
for j in range(vol): # 遍历列
data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格
table.setItem(i, j, data)
table.resizeColumnsToContents() # 使列宽跟随内容改变
table.resizeRowsToContents() # 使行高跟随内容改变
table.setAlternatingRowColors(True) # 使表格颜色交错显示
vhayout.addWidget(table) # 将表格添加倒水平布局中
self.setLayout(vhayout) # 设置当前窗口的布局方式
if __name__ == "__main__":
import sys
app = QApplication(sys.argv) # 创建窗口程序
demo = Demo() # 创建窗口类对象
demo.show()
sys.exit(app.exec_())
运行程序,效果显示如下:
3. 隐藏垂直标题
表格在显示数据时,默认会以编号的形式自动形成一列垂直标题,如果需要隐藏,可以使用verticalHeader()获取垂直标题,然后使用setVisible()方法将其隐藏。
示例:用setVisible()方法隐藏垂直标题
关键代码如下:
table.verticalHeader().setVisible(False) # 隐藏垂直标题
完整代码如下:
from PyQt5.QtWidgets import *
class Demo(QWidget):
def __init__(self, parent=None):
super(Demo, self).__init__(parent)
self.initUi() # 初始化窗口
def initUi(self):
self.setWindowTitle("使用表格显示数据库中的数据")
self.resize(520, 320) # 设置窗口大小
vhayout = QHBoxLayout() # 创建水平布局
table = QTableWidget() # 创建表格
import pymysql
# 打开数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="mrsoft", charset="utf8")
cursor = db.cursor() # 使用cursor()方法获取操作游标
cursor.execute("select * from books") # 执行SQL语句
result = cursor.fetchall() # 获取所有记录
row = cursor.rowcount # 取得记录个数,用于设置表格的行数
vol = len(result[0]) # 取得字段个数,用于设置表格的列数
cursor.close() # 关闭游标
db.close() # 关闭连接
table.setRowCount(row) # 设置表格行数
table.setColumnCount(vol) # 设置表格列数
table.setHorizontalHeaderLabels(["ID", "图书名称", "图书分类", "图书价格", "出版时间"]) # 设置表格的标题名称
for i in range(row): # 遍历行
for j in range(vol): # 遍历列
data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格
table.setItem(i, j, data)
table.resizeColumnsToContents() # 使列宽跟随内容改变
table.resizeRowsToContents() # 使行高跟随内容改变
table.setAlternatingRowColors(True) # 使表格颜色交错显示
vhayout.addWidget(table) # 将表格添加倒水平布局中
self.setLayout(vhayout) # 设置当前窗口的布局方式
# 隐藏垂直标题
table.verticalHeader().setVisible(False)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv) # 创建窗口程序
demo = Demo() # 创建窗口类对象
demo.show()
sys.exit(app.exec_())
如果需要隐藏表格的水平标题,可以使用如下代码:
table.horizontalHeader().setVisible(False) # 隐藏水平标题
4. 设置最后一列自动填充容器
表格中的列默认会以默认宽度显示,但如果遇到窗口伸缩的情况,在放大窗口时,由于表格是固定的,就会造成窗口中可能会出现大面积的空白区域,影响整体的美观。在PyQt5中可以使用setstret-chlastSection()方法将表格的最后一列设置为自动伸缩列,这样就可以自动填充整个容器。
示例:设置最后一列的列宽随窗口缩放而变化
关键代码如下:
table. horizontalHeader().setStretchLastSection(True) # 设置最后一列自动填充容器
完整代码如下:
from PyQt5.QtWidgets import *
class Demo(QWidget):
def __init__(self, parent=None):
super(Demo, self).__init__(parent)
self.initUi() # 初始化窗口
def initUi(self):
self.setWindowTitle("使用表格显示数据库中的数据")
self.resize(520, 320) # 设置窗口大小
vhayout = QHBoxLayout() # 创建水平布局
table = QTableWidget() # 创建表格
import pymysql
# 打开数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="mrsoft", charset="utf8")
cursor = db.cursor() # 使用cursor()方法获取操作游标
cursor.execute("select * from books") # 执行SQL语句
result = cursor.fetchall() # 获取所有记录
row = cursor.rowcount # 取得记录个数,用于设置表格的行数
vol = len(result[0]) # 取得字段个数,用于设置表格的列数
cursor.close() # 关闭游标
db.close() # 关闭连接
table.setRowCount(row) # 设置表格行数
table.setColumnCount(vol) # 设置表格列数
table.setHorizontalHeaderLabels(["ID", "图书名称", "图书分类", "图书价格", "出版时间"]) # 设置表格的标题名称
for i in range(row): # 遍历行
for j in range(vol): # 遍历列
data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格
table.setItem(i, j, data)
table.resizeColumnsToContents() # 使列宽跟随内容改变
table.resizeRowsToContents() # 使行高跟随内容改变
table.setAlternatingRowColors(True) # 使表格颜色交错显示
vhayout.addWidget(table) # 将表格添加倒水平布局中
self.setLayout(vhayout) # 设置当前窗口的布局方式
# 隐藏垂直标题
table.verticalHeader().setVisible(False)
# 设置最后一列自动填充容器
table.horizontalHeader().setStretchLastSection(True)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv) # 创建窗口程序
demo = Demo() # 创建窗口类对象
demo.show()
sys.exit(app.exec_())
效果如下图所示:
示例:设置表格所有列按比例随窗口自动缩放
上面的代码将最后一列设置为了自动伸缩列,除此之外,还可以将整个表格设置为自动伸缩模式,这样,在放大或缩小窗口时,整个表格的所有列都会按比例自动缩放。
关键代码如下:
table.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
完整代码如下:
from PyQt5.QtWidgets import *
from PyQt5 import QtWidgets
class Demo(QWidget):
def __init__(self, parent=None):
super(Demo, self).__init__(parent)
self.initUi() # 初始化窗口
def initUi(self):
self.setWindowTitle("使用表格显示数据库中的数据")
self.resize(520, 320) # 设置窗口大小
vhayout = QHBoxLayout() # 创建水平布局
table = QTableWidget() # 创建表格
import pymysql
# 打开数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="mrsoft", charset="utf8")
cursor = db.cursor() # 使用cursor()方法获取操作游标
cursor.execute("select * from books") # 执行SQL语句
result = cursor.fetchall() # 获取所有记录
row = cursor.rowcount # 取得记录个数,用于设置表格的行数
vol = len(result[0]) # 取得字段个数,用于设置表格的列数
cursor.close() # 关闭游标
db.close() # 关闭连接
table.setRowCount(row) # 设置表格行数
table.setColumnCount(vol) # 设置表格列数
table.setHorizontalHeaderLabels(["ID", "图书名称", "图书分类", "图书价格", "出版时间"]) # 设置表格的标题名称
for i in range(row): # 遍历行
for j in range(vol): # 遍历列
data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格
table.setItem(i, j, data)
table.resizeColumnsToContents() # 使列宽跟随内容改变
table.resizeRowsToContents() # 使行高跟随内容改变
table.setAlternatingRowColors(True) # 使表格颜色交错显示
vhayout.addWidget(table) # 将表格添加倒水平布局中
self.setLayout(vhayout) # 设置当前窗口的布局方式
# 隐藏垂直标题
table.verticalHeader().setVisible(False)
# # 设置最后一列自动填充容器
# table.horizontalHeader().setStretchLastSection(True)
table.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv) # 创建窗口程序
demo = Demo() # 创建窗口类对象
demo.show()
sys.exit(app.exec_())
运行效果如下图:
5. 禁止编辑单元格
示例:设置禁止编辑单元格中的内容
当双击表格中的某个单元格时,表格中的数据默认情况下是可以编辑的,但如果只需要查看数据,则可以使用表格对象的setEditTriggers()方法将表格的单元格设置为禁止编辑状态。
关键代码如下:
table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) # 禁止编辑单元格
完整代码如下:
from PyQt5.QtWidgets import *
from PyQt5 import QtWidgets
class Demo(QWidget):
def __init__(self, parent=None):
super(Demo, self).__init__(parent)
self.initUi() # 初始化窗口
def initUi(self):
self.setWindowTitle("使用表格显示数据库中的数据")
self.resize(520, 320) # 设置窗口大小
vhayout = QHBoxLayout() # 创建水平布局
table = QTableWidget() # 创建表格
import pymysql
# 打开数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="mrsoft", charset="utf8")
cursor = db.cursor() # 使用cursor()方法获取操作游标
cursor.execute("select * from books") # 执行SQL语句
result = cursor.fetchall() # 获取所有记录
row = cursor.rowcount # 取得记录个数,用于设置表格的行数
vol = len(result[0]) # 取得字段个数,用于设置表格的列数
cursor.close() # 关闭游标
db.close() # 关闭连接
table.setRowCount(row) # 设置表格行数
table.setColumnCount(vol) # 设置表格列数
table.setHorizontalHeaderLabels(["ID", "图书名称", "图书分类", "图书价格", "出版时间"]) # 设置表格的标题名称
for i in range(row): # 遍历行
for j in range(vol): # 遍历列
data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格
table.setItem(i, j, data)
table.resizeColumnsToContents() # 使列宽跟随内容改变
table.resizeRowsToContents() # 使行高跟随内容改变
table.setAlternatingRowColors(True) # 使表格颜色交错显示
vhayout.addWidget(table) # 将表格添加倒水平布局中
self.setLayout(vhayout) # 设置当前窗口的布局方式
# 隐藏垂直标题
table.verticalHeader().setVisible(False)
# # 设置最后一列自动填充容器
# table.horizontalHeader().setStretchLastSection(True)
table.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
# 禁止编辑单元格
table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv) # 创建窗口程序
demo = Demo() # 创建窗口类对象
demo.show()
sys.exit(app.exec_())
6. 设置单元格的文本颜色
使用QTableWidgetItem对象的setForeground()方法可以设置单元格内文本的颜色,其参数为一个QBrush对象,在该对象中可以使用颜色名或者RGB值来对颜色进行设置。
示例:用setForeground()方法将单元格内的文字设置为绿色
关键代码:
data.setForeground(QtGui.QBrush(QtGui.QColor("green"))) # 设置单元格文本颜色
完整代码如下:
from PyQt5.QtWidgets import *
from PyQt5 import QtGui
from PyQt5 import QtWidgets
class Demo(QWidget):
def __init__(self, parent=None):
super(Demo, self).__init__(parent)
self.initUi() # 初始化窗口
def initUi(self):
self.setWindowTitle("使用表格显示数据库中的数据")
self.resize(520, 320) # 设置窗口大小
vhayout = QHBoxLayout() # 创建水平布局
table = QTableWidget() # 创建表格
import pymysql
# 打开数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="mrsoft", charset="utf8")
cursor = db.cursor() # 使用cursor()方法获取操作游标
cursor.execute("select * from books") # 执行SQL语句
result = cursor.fetchall() # 获取所有记录
row = cursor.rowcount # 取得记录个数,用于设置表格的行数
vol = len(result[0]) # 取得字段个数,用于设置表格的列数
cursor.close() # 关闭游标
db.close() # 关闭连接
table.setRowCount(row) # 设置表格行数
table.setColumnCount(vol) # 设置表格列数
table.setHorizontalHeaderLabels(["ID", "图书名称", "图书分类", "图书价格", "出版时间"]) # 设置表格的标题名称
for i in range(row): # 遍历行
for j in range(vol): # 遍历列
data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格
table.setItem(i, j, data)
# 设置单元格文本颜色
data.setForeground(QtGui.QBrush(QtGui.QColor("green")))
table.resizeColumnsToContents() # 使列宽跟随内容改变
table.resizeRowsToContents() # 使行高跟随内容改变
table.setAlternatingRowColors(True) # 使表格颜色交错显示
vhayout.addWidget(table) # 将表格添加倒水平布局中
self.setLayout(vhayout) # 设置当前窗口的布局方式
# 隐藏垂直标题
table.verticalHeader().setVisible(False)
# # 设置最后一列自动填充容器
# table.horizontalHeader().setStretchLastSection(True)
table.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
# 禁止编辑单元格
table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv) # 创建窗口程序
demo = Demo() # 创建窗口类对象
demo.show()
sys.exit(app.exec_())
运行效果如下:
示例:用setBackground()方法设置单元格的背景颜色
如果需要设置单元格的背景颜色,可以使用setBackground()方法。
关键代码:
data.setBackground(QtGui.QBrush(QtGui.QColor("yellow"))) # 设置单元格背景颜色
完整代码如下:
from PyQt5.QtWidgets import *
from PyQt5 import QtGui
from PyQt5 import QtWidgets
class Demo(QWidget):
def __init__(self, parent=None):
super(Demo, self).__init__(parent)
self.initUi() # 初始化窗口
def initUi(self):
self.setWindowTitle("使用表格显示数据库中的数据")
self.resize(950, 320) # 设置窗口大小
vhayout = QHBoxLayout() # 创建水平布局
table = QTableWidget() # 创建表格
import pymysql
# 打开数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="mrsoft", charset="utf8")
cursor = db.cursor() # 使用cursor()方法获取操作游标
cursor.execute("select * from books") # 执行SQL语句
result = cursor.fetchall() # 获取所有记录
row = cursor.rowcount # 取得记录个数,用于设置表格的行数
vol = len(result[0]) # 取得字段个数,用于设置表格的列数
cursor.close() # 关闭游标
db.close() # 关闭连接
table.setRowCount(row) # 设置表格行数
table.setColumnCount(vol) # 设置表格列数
table.setHorizontalHeaderLabels(["ID", "图书名称", "图书分类", "图书价格", "出版时间"]) # 设置表格的标题名称
for i in range(row): # 遍历行
for j in range(vol): # 遍历列
data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格
table.setItem(i, j, data)
# # 设置单元格文本颜色
# data.setForeground(QtGui.QBrush(QtGui.QColor("green")))
# 设置单元格背景颜色
data.setBackground(QtGui.QBrush(QtGui.QColor("yellow")))
table.resizeColumnsToContents() # 使列宽跟随内容改变
table.resizeRowsToContents() # 使行高跟随内容改变
table.setAlternatingRowColors(True) # 使表格颜色交错显示
vhayout.addWidget(table) # 将表格添加倒水平布局中
self.setLayout(vhayout) # 设置当前窗口的布局方式
# 隐藏垂直标题
table.verticalHeader().setVisible(False)
# # 设置最后一列自动填充容器
# table.horizontalHeader().setStretchLastSection(True)
table.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
# 禁止编辑单元格
table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv) # 创建窗口程序
demo = Demo() # 创建窗口类对象
demo.show()
sys.exit(app.exec_())
运行效果如下:
7. 设置指定列的排序方式
使用QTableWidget对象的sortItems()方法,可以设置表格中指定列的排序方式。语法如下:
sortItems(column, order)
sortItems()方法的参数说明
参数 | 说明 |
---|---|
column | 一个整数数字,表示要进行排序的列索引。 |
order | 一个枚举值,指定排序方式,其中,Qt.DescendingOrder表示降序,Qt.AscendingOrder表示升序。 |
示例:按照“出版时间”降序(从大到小)排列表格
将上一示例的表格内的“出版时间”一列按照降序排列,由于“出版时间”列的索引是4(索引从0开始),关键代码如下:
table.sortItems(4, QtCore.Qt.DescendingOrder) # 设置降序排序
from PyQt5.QtWidgets import *
from PyQt5 import QtGui, QtCore
from PyQt5 import QtWidgets
class Demo(QWidget):
def __init__(self, parent=None):
super(Demo, self).__init__(parent)
self.initUi() # 初始化窗口
def initUi(self):
self.setWindowTitle("使用表格显示数据库中的数据")
self.resize(950, 320) # 设置窗口大小
vhayout = QHBoxLayout() # 创建水平布局
table = QTableWidget() # 创建表格
import pymysql
# 打开数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="mrsoft", charset="utf8")
cursor = db.cursor() # 使用cursor()方法获取操作游标
cursor.execute("select * from books") # 执行SQL语句
result = cursor.fetchall() # 获取所有记录
row = cursor.rowcount # 取得记录个数,用于设置表格的行数
vol = len(result[0]) # 取得字段个数,用于设置表格的列数
cursor.close() # 关闭游标
db.close() # 关闭连接
table.setRowCount(row) # 设置表格行数
table.setColumnCount(vol) # 设置表格列数
table.setHorizontalHeaderLabels(["ID", "图书名称", "图书分类", "图书价格", "出版时间"]) # 设置表格的标题名称
for i in range(row): # 遍历行
for j in range(vol): # 遍历列
data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格
table.setItem(i, j, data)
# # 设置单元格文本颜色
# data.setForeground(QtGui.QBrush(QtGui.QColor("green")))
# 设置单元格背景颜色
data.setBackground(QtGui.QBrush(QtGui.QColor("yellow")))
table.resizeColumnsToContents() # 使列宽跟随内容改变
table.resizeRowsToContents() # 使行高跟随内容改变
table.setAlternatingRowColors(True) # 使表格颜色交错显示
vhayout.addWidget(table) # 将表格添加倒水平布局中
self.setLayout(vhayout) # 设置当前窗口的布局方式
# 隐藏垂直标题
table.verticalHeader().setVisible(False)
# # 设置最后一列自动填充容器
# table.horizontalHeader().setStretchLastSection(True)
table.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
# 禁止编辑单元格
table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
# 设置降序排序
table.sortItems(4, QtCore.Qt.DescendingOrder)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv) # 创建窗口程序
demo = Demo() # 创建窗口类对象
demo.show()
sys.exit(app.exec_())
运行效果于原来的对比如下:
8. 在指定列中显示图片
表格除了可以显示文字,还可以显示图片,显示图片可以在创建QTableWidgetItem对象时传入QIcon图标对象实现。
示例:在“出版时间”列旁显示日历图片
在上一示例表格中的第4列“出版时间”旁边显示一个日历图片,关键代码如下:
if j == 4: # 如果是第4列,则显示图片
data = QTableWidgetItem(QtGui.QIcon("./image/date.png"), str(result[i][j])) # 插入图片和文字
else:
data = QTableWidgetItem(str(result[i][j])) # 直接插入文字
完整代码如下:
from PyQt5.QtWidgets import *
from PyQt5 import QtGui, QtCore
from PyQt5 import QtWidgets
class Demo(QWidget):
def __init__(self, parent=None):
super(Demo, self).__init__(parent)
self.initUi() # 初始化窗口
def initUi(self):
self.setWindowTitle("使用表格显示数据库中的数据")
self.resize(950, 320) # 设置窗口大小
vhayout = QHBoxLayout() # 创建水平布局
table = QTableWidget() # 创建表格
import pymysql
# 打开数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="mrsoft", charset="utf8")
cursor = db.cursor() # 使用cursor()方法获取操作游标
cursor.execute("select * from books") # 执行SQL语句
result = cursor.fetchall() # 获取所有记录
row = cursor.rowcount # 取得记录个数,用于设置表格的行数
vol = len(result[0]) # 取得字段个数,用于设置表格的列数
cursor.close() # 关闭游标
db.close() # 关闭连接
table.setRowCount(row) # 设置表格行数
table.setColumnCount(vol) # 设置表格列数
table.setHorizontalHeaderLabels(["ID", "图书名称", "图书分类", "图书价格", "出版时间"]) # 设置表格的标题名称
for i in range(row): # 遍历行
for j in range(vol): # 遍历列
# 设置插入日历图片
if j == 4: # 如果是第4列,则显示图片
data = QTableWidgetItem(QtGui.QIcon("./image/date.png"), str(result[i][j])) # 插入图片和文字
else:
data = QTableWidgetItem(str(result[i][j])) # 直接插入文字
# data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格
table.setItem(i, j, data)
# # # 设置单元格文本颜色
# # data.setForeground(QtGui.QBrush(QtGui.QColor("green")))
# # 设置单元格背景颜色
# data.setBackground(QtGui.QBrush(QtGui.QColor("yellow")))
table.resizeColumnsToContents() # 使列宽跟随内容改变
table.resizeRowsToContents() # 使行高跟随内容改变
table.setAlternatingRowColors(True) # 使表格颜色交错显示
vhayout.addWidget(table) # 将表格添加倒水平布局中
self.setLayout(vhayout) # 设置当前窗口的布局方式
# 隐藏垂直标题
table.verticalHeader().setVisible(False)
# # 设置最后一列自动填充容器
# table.horizontalHeader().setStretchLastSection(True)
table.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
# 禁止编辑单元格
table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
# # 设置降序排序
# table.sortItems(4, QtCore.Qt.DescendingOrder)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv) # 创建窗口程序
demo = Demo() # 创建窗口类对象
demo.show()
sys.exit(app.exec_())
运行效果如下:
9. 向指定列中添加PyQt5标准控件
TableWidget表格不仅可以显示文字、图片,还可显示PyQt5的标准控件,实现该功能需要使用setCellWidget()方法,语法如下:
setCellWidget(row, column, QWidget)
setCellWidget()方法的参数说明
参数 | 说明 |
---|---|
row | 一个整数数字,表示要添加控件的单元格的行索引 |
column | 一个整数数字,表示要添加控件的单元格的列索引 |
QWidget | Pyqt5标准控件 |
示例:将“图书分类”显示为标准控件ComboBox下拉列表
将上面示例表格中的第2列“图书分类”显示为ComboBox下拉列表,允许用户从中选择数据。
关键代码如下:
# 将下标第2列设置为ComboBox下拉列表
if j == 2: # 判断是否为第2列
combobox = QComboBox() # 创建一个下拉列表对象
# 为下拉列表设置数据源
combobox.addItems(["Python", "Java", "C语言", ".NET"])
combobox.setCurrentIndex(0) # 设置默认选中第一项
table.setCellWidget(i, 2, combobox) # 将创建的下拉列表显示在表格中
else:
data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格
table.setItem(i, j, data)
完整代码如下:
from PyQt5.QtWidgets import *
from PyQt5 import QtGui, QtCore
from PyQt5 import QtWidgets
class Demo(QWidget):
def __init__(self, parent=None):
super(Demo, self).__init__(parent)
self.initUi() # 初始化窗口
def initUi(self):
self.setWindowTitle("使用表格显示数据库中的数据")
self.resize(950, 320) # 设置窗口大小
vhayout = QHBoxLayout() # 创建水平布局
table = QTableWidget() # 创建表格
import pymysql
# 打开数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="mrsoft", charset="utf8")
cursor = db.cursor() # 使用cursor()方法获取操作游标
cursor.execute("select * from books") # 执行SQL语句
result = cursor.fetchall() # 获取所有记录
row = cursor.rowcount # 取得记录个数,用于设置表格的行数
vol = len(result[0]) # 取得字段个数,用于设置表格的列数
cursor.close() # 关闭游标
db.close() # 关闭连接
table.setRowCount(row) # 设置表格行数
table.setColumnCount(vol) # 设置表格列数
table.setHorizontalHeaderLabels(["ID", "图书名称", "图书分类", "图书价格", "出版时间"]) # 设置表格的标题名称
for i in range(row): # 遍历行
for j in range(vol): # 遍历列
# 在下标第4列设置插入日历图片
if j == 4: # 如果是第4列,则显示图片
data = QTableWidgetItem(QtGui.QIcon("./image/date.png"), str(result[i][j])) # 插入图片和文字
else:
data = QTableWidgetItem(str(result[i][j])) # 直接插入文字
# data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格
# 将下标第2列设置为ComboBox下拉列表
if j == 2: # 判断是否为第2列
combobox = QComboBox() # 创建一个下拉列表对象
# 为下拉列表设置数据源
combobox.addItems(["Python", "Java", "C语言", ".NET"])
combobox.setCurrentIndex(0) # 设置默认选中第一项
table.setCellWidget(i, 2, combobox) # 将创建的下拉列表显示在表格中
else:
data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格
table.setItem(i, j, data)
# table.setItem(i, j, data)
# # # 设置单元格文本颜色
# # data.setForeground(QtGui.QBrush(QtGui.QColor("green")))
# # 设置单元格背景颜色
# data.setBackground(QtGui.QBrush(QtGui.QColor("yellow")))
table.resizeColumnsToContents() # 使列宽跟随内容改变
table.resizeRowsToContents() # 使行高跟随内容改变
table.setAlternatingRowColors(True) # 使表格颜色交错显示
vhayout.addWidget(table) # 将表格添加倒水平布局中
self.setLayout(vhayout) # 设置当前窗口的布局方式
# 隐藏垂直标题
table.verticalHeader().setVisible(False)
# # 设置最后一列自动填充容器
# table.horizontalHeader().setStretchLastSection(True)
table.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
# 禁止编辑单元格
table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
# # 设置降序排序
# table.sortItems(4, QtCore.Qt.DescendingOrder)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv) # 创建窗口程序
demo = Demo() # 创建窗口类对象
demo.show()
sys.exit(app.exec_())
运行效果如下:
通过使用setCellWidget()方法可以向表格中添加任何PyQt5标准控件,例如,在实际项目开发中常见的“查看详情”“编辑”“删除”按钮、指示某行是否选中的复选框等。
10. 合并指定单元格
在实际项目开发中,经常遇到合并单元格的情况。在上面示例中,有部分图书额价格相同、有的出版时间相同、也有的图书分类相同,遇到类似的情况,就可将显示相同数据的单元格进行合并。
在PyQt5中合并表格的单元格,需要使用setSpan()方法,该方法的语法如下:
setSpan(row, column, rowSpanCount, columnSpanCount)
setSpan()方法的参数说明
参数 | 说明 |
---|---|
row | 一个整数数字,表示要改变的单元格的行索引。 |
column | 一个整数数字,表示要改变的单元格的列索引。 |
rowSpanCount | 一个整数数字,表示需要合并的行数。 |
columSpanCount | マージする必要がある列の数を表す整数。 |
例: 同じデータを持つセルを結合する
キーコードは次のとおりです。
# 合并相同数据单元格
# 合并第3列的第1-5行
# (0表示第1行,2表示第3列,5表示跨越5行<1、2、3、4、5行>,1表示跨越1列)
table.setSpan(0, 2, 5, 1)
# (2表示第2行,3表示第4列,3表示跨越3行<3、4、5行>,1表示跨越1列)
table.setSpan(2, 3, 3, 1)
# (2表示第3行,4表示第5列,3表示跨越3行<3、4、5行>,1表示跨越1列)
table.setSpan(2, 4, 3, 1)
完全なコードは次のとおりです。
from PyQt5.QtWidgets import *
from PyQt5 import QtGui, QtCore
from PyQt5 import QtWidgets
class Demo(QWidget):
def __init__(self, parent=None):
super(Demo, self).__init__(parent)
self.initUi() # 初始化窗口
def initUi(self):
self.setWindowTitle("使用表格显示数据库中的数据")
self.resize(950, 320) # 设置窗口大小
vhayout = QHBoxLayout() # 创建水平布局
table = QTableWidget() # 创建表格
import pymysql
# 打开数据库连接
db = pymysql.connect(host="localhost", user="root", password="123456", database="mrsoft", charset="utf8")
cursor = db.cursor() # 使用cursor()方法获取操作游标
cursor.execute("select * from books") # 执行SQL语句
result = cursor.fetchall() # 获取所有记录
row = cursor.rowcount # 取得记录个数,用于设置表格的行数
vol = len(result[0]) # 取得字段个数,用于设置表格的列数
cursor.close() # 关闭游标
db.close() # 关闭连接
table.setRowCount(row) # 设置表格行数
table.setColumnCount(vol) # 设置表格列数
table.setHorizontalHeaderLabels(["ID", "图书名称", "图书分类", "图书价格", "出版时间"]) # 设置表格的标题名称
for i in range(row): # 遍历行
for j in range(vol): # 遍历列
# 在下标第4列设置插入日历图片
if j == 4: # 如果是第4列,则显示图片
data = QTableWidgetItem(QtGui.QIcon("./image/date.png"), str(result[i][j])) # 插入图片和文字
else:
data = QTableWidgetItem(str(result[i][j])) # 直接插入文字
# data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格
# # 将下标第2列设置为ComboBox下拉列表
# if j == 2: # 判断是否为第2列
# combobox = QComboBox() # 创建一个下拉列表对象
# # 为下拉列表设置数据源
# combobox.addItems(["Python", "Java", "C语言", ".NET"])
# combobox.setCurrentIndex(0) # 设置默认选中第一项
# table.setCellWidget(i, 2, combobox) # 将创建的下拉列表显示在表格中
# else:
# data = QTableWidgetItem(str(result[i][j])) # 转换后可插入表格
# table.setItem(i, j, data)
table.setItem(i, j, data)
# # # 设置单元格文本颜色
# # data.setForeground(QtGui.QBrush(QtGui.QColor("green")))
# # 设置单元格背景颜色
# data.setBackground(QtGui.QBrush(QtGui.QColor("yellow")))
table.resizeColumnsToContents() # 使列宽跟随内容改变
table.resizeRowsToContents() # 使行高跟随内容改变
table.setAlternatingRowColors(True) # 使表格颜色交错显示
vhayout.addWidget(table) # 将表格添加倒水平布局中
self.setLayout(vhayout) # 设置当前窗口的布局方式
# 隐藏垂直标题
table.verticalHeader().setVisible(False)
# # 设置最后一列自动填充容器
# table.horizontalHeader().setStretchLastSection(True)
table.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
# 禁止编辑单元格
table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
# # 设置降序排序
# table.sortItems(4, QtCore.Qt.DescendingOrder)
# 合并相同数据单元格
# 合并第3列的第1-5行
# (0表示第1行,2表示第3列,5表示跨越5行<1、2、3、4、5行>,1表示跨越1列)
table.setSpan(0, 2, 5, 1)
# (2表示第2行,3表示第4列,3表示跨越3行<3、4、5行>,1表示跨越1列)
table.setSpan(2, 3, 3, 1)
# (2表示第3行,4表示第5列,3表示跨越3行<3、4、5行>,1表示跨越1列)
table.setSpan(2, 4, 3, 1)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv) # 创建窗口程序
demo = Demo() # 创建窗口类对象
demo.show()
sys.exit(app.exec_())
組み合わせた効果は次のとおりです。
本来の効果は以下の通りです。