鱼C论坛

 找回密码
 立即注册
查看: 2665|回复: 6

[已解决]PyQt5 ListView列表加载太慢如何解决?

[复制链接]
发表于 2021-4-2 21:02:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我现在在做一个电影爬虫的GUI

想在窗口看到所有电影的名字,点击查看详细信息。

由于要用clicked 触发定位,我选择使用ListView

但在在爬到电影后 是一个很大的列表。由于采用了以下代码,窗口会一瞬间全部刷新。

我希望窗口能够动态加载影片信息,而不是一口吃个胖子。

但是又想要有影片的定位功能。我该怎么做?
            lambda: self.slm.setStringList(self.MovieNameList),
            lambda: self.listView.setModel(self.slm),
            lambda: print("影片信息加载完毕..."),



最佳答案
2021-4-3 12:34:12
我的想法是
1.先设置一个空的model实例到listView实例。
2.启动一个新线程,线程内遍历你的电影信息列表,逐项添加到步骤1中创建model实例。
3.每添加一项(或者每添加n项或每隔一定时间),就发送一个自定义信号给listView实例的update方法更新界面(也许不需要调用update方法也可以自动更新界面,我没有试过不清楚)。

以上是大概思路,我也没有试过所以不清楚能不能达到效果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-2 21:12:24 | 显示全部楼层
当初没考虑用listWiget原因是担心索址操作 index()耗时太长 (相较于self.listView.clicked.connect(self.list_clicked_fun) 直接返回一个索引地址) 。当影片信息一多 鼠标点击 要很久才能显示出信息。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-2 21:19:24 | 显示全部楼层
想实现流式布局 增加元素就像append一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-3 07:51:59 From FishC Mobile | 显示全部楼层
591821661 发表于 2021-4-2 21:19
想实现流式布局 增加元素就像append一样

GUI并不是Python的强项
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-3 12:13:07 From FishC Mobile | 显示全部楼层
wp231957 发表于 2021-4-3 07:51
GUI并不是Python的强项

那你推荐一个gui能移植python代码的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-3 12:34:12 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
我的想法是
1.先设置一个空的model实例到listView实例。
2.启动一个新线程,线程内遍历你的电影信息列表,逐项添加到步骤1中创建model实例。
3.每添加一项(或者每添加n项或每隔一定时间),就发送一个自定义信号给listView实例的update方法更新界面(也许不需要调用update方法也可以自动更新界面,我没有试过不清楚)。

以上是大概思路,我也没有试过所以不清楚能不能达到效果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-5 23:13:50 | 显示全部楼层
本帖最后由 591821661 于 2021-4-5 23:15 编辑

实践证明 ListWidget Born to do this!

在ListWidget中甚至能够追加ListView对象 ,其相当于ListView静态显示框的动态拓展。

不断增加的电影数 更适合使用ListWidget,

至于如何定位 可以在文本中加入序号 再用RE来解析 如  '[1] XXX电影名'   
        sel_str = r'\[(\d*?)\]'
        sel_num = max(1, int(re.findall(sel_str, item.text(), re.S)[0]))

listWidget = QListWidget() #实例化一个(item base)的列表
listWidget.addItem('dd') #添加一个项
listWidget.addItems([]) # 从序列中添加子项
listWidget.setDragEnabled(True) #设置拖拉
listWidget.sortItems() #排序
listWidget.selectAll()全选
listWidget.setSortingEnabled(bool) #设置自动排序
listWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) #设置选择模式
选择模式有:ExtendedSelection 按住ctrl多选, SingleSelection 单选 MultiSelection 点击多选 ContiguousSelection 鼠标拖拉多选
listWidget.setCurrentRow(0) 设置当前选择行默认为-1
listWidget.count() #得到子项总数
listWidget.item(row).text() #得到第 row 行的内容 listWidget.item(row) 返回一个item 对象
listWidget.takeItem(row) #返回row 行的所在的item 对象 可以用在 insertItem()中
listWidget.insertItem(2,item) #在第二行插入一项 item 可谓为一个listviewitem对象 或者string
listWidget.setCurrentItem('dd') #设置'dd'为当前项
listWidget.selectedItems() 返回一个包含item对象 的list 对象
item.setText('dsds') # 修改item 的内容,设置item的内容为‘dsds’ item为对象 可从 listWidget.item(row) takeItem(row) 得到

转自ListWidget函数方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 04:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表