PtQt QtableWidget 懒加载 优化表单读取

首先找到了一篇好博文,感谢指路人: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_())

你可能感兴趣的:(python,pyqt,pyqt)