首先找到了一篇好博文,感谢指路人:python懒加载Pandas数据到QTableWidget上
运行代码示例,完美!
但是有个问题是示例的做法是新建了一个滑条,来获取滑条移动信号,来修改tablewidget的内容
这里存在一点小问题是无法在tableWidget上使用滚轮滑动,这个应该可以优化,但是还有一个比较大的影响是我要显示的内容存在图片,每次刷新表单估计会卡。
由于我的需求有所不同,并没有特别大量的数据,只是存在图片加载慢
所以我希望只加载当前页及页面前后几行图片,其他的等滚轮移动加载
那么要实现当前表单下的懒加载,需要先获取到滑动条的移动信号
按教程的方法获取信号是使用scrollname.valueChange.connect()
尝试使用tablewidgetname.valueChange.connect()
,报错,没有valueChange属性。
翻阅资料后找到方法:QTableView - 滚动时更改选择
好,尝试套到tablewidget得到tablewidget的滑条改变信号,并得到当前显示的头行行号,感觉能成了。
把添加image的过程抽出来,也就是表单不会加载图片
然后我们添加一个view_img函数
def view_img(self, top_column):
for column in range(top_column,top_column+20): # 表单显示15行,剩下5行预加载
if not self.widget_table.cellWidget(column, 3) and column<len(self.img_path):
lb_icon = QtWidgets.QLabel()
lb.icon.setStyleSheet("margin:2px;border-image:url({})".formant(self.img_path[column]))
self.widget_table.setCellWidget(column, 3, lb_icon)
运行脚本,当滚轮滑动时,图片就会不断加载出来
最后,处理下刚开表单没有图片的小问题,让表单加载时执行view_img(0),也就是加载首页
先放效果图
最后上代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2021/3/25 14:54
# @Author : Link
# @Site :
# @File : df_widget.py
# @Software: PyCharm
# @Modify : Way
# @Date[-1]: 2022/1/24
from PyQt5.QtWidgets import QHBoxLayout, QTableWidget, QTableWidgetItem, QScrollBar, QWidget
from pandas import DataFrame, isnull
class dfQTable(QWidget):
rowCount = 0 # 单页可以显示的数据条数
df = DataFrame()
def __init__(self, *args):
super(dfQTable, self).__init__()
self.ui_setup()
self.resize(780, 500)
def ui_setup(self):
# 使用竖直Layout
self.horizontalLayout = QHBoxLayout(self)
# 建立一个QTableWidget
self.table = QTableWidget(self)
self.horizontalLayout.addWidget(self.table)
self.table.verticalScrollBar().valueChanged.connect(self.pdToQTableWidget)
def setDfData(self, df: DataFrame):
self.df = df
self.table.setRowCount(self.df.index.size)
self.df_columns = self.df.columns.size
df_header = self.df.columns.values.tolist()
self.table.setColumnCount(self.df_columns)
self.table.setHorizontalHeaderLabels(df_header)
self.pdToQTableWidget(0)
def pdToQTableWidget(self,top_index):
"""
更新页面数据
:return:
"""
if any(self.df):
# 数据预览窗口
for row in range(top_index, top_index+20):
for column in range(self.df_columns):
value = ''
if row < self.df.index.size:
value = '' if isnull(self.df.iloc[row, column]) else str(self.df.iloc[row, column])
tempItem = QTableWidgetItem(value)
self.table.setItem(row, column, tempItem)
if __name__ == '__main__':
import sys
from PyQt5.QtWidgets import QApplication
from faker import Faker # pip install Faker
import pandas as pd
fake = Faker()
te_data = []
for index in range(1, 5000):
te_data.append({
"ColumnOne": index,
"ColumnTwo": fake.word(),
"ColumnThree": fake.word(),
"ColumnFour": fake.word(),
"ColumnFive": fake.word(),
"ColumnSix": fake.word(),
"ColumnSeven": fake.word(),
})
print(f'{index}/5000')
df = pd.DataFrame(te_data)
print("start")
app = QApplication(sys.argv)
myWin = dfQTable()
myWin.show()
myWin.setDfData(df)
sys.exit(app.exec_())