591821661 发表于 2021-4-2 21:02:39

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

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

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

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

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

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

但是又想要有影片的定位功能。我该怎么做?

            lambda: self.slm.setStringList(self.MovieNameList),
            lambda: self.listView.setModel(self.slm),
            lambda: print("影片信息加载完毕..."),



591821661 发表于 2021-4-2 21:12:24

当初没考虑用listWiget原因是担心索址操作 index()耗时太长 (相较于self.listView.clicked.connect(self.list_clicked_fun) 直接返回一个索引地址) 。当影片信息一多 鼠标点击 要很久才能显示出信息。

591821661 发表于 2021-4-2 21:19:24

想实现流式布局 增加元素就像append一样

wp231957 发表于 2021-4-3 07:51:59

591821661 发表于 2021-4-2 21:19
想实现流式布局 增加元素就像append一样

GUI并不是Python的强项

591821661 发表于 2021-4-3 12:13:07

wp231957 发表于 2021-4-3 07:51
GUI并不是Python的强项

那你推荐一个gui能移植python代码的

hrp 发表于 2021-4-3 12:34:12

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

以上是大概思路,我也没有试过所以不清楚能不能达到效果。

591821661 发表于 2021-4-5 23:13:50

本帖最后由 591821661 于 2021-4-5 23:15 编辑

实践证明 ListWidget Born to do this!

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

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

至于如何定位 可以在文本中加入序号 再用RE来解析 如' XXX电影名'   

      sel_str = r'\[(\d*?)\]'
      sel_num = max(1, int(re.findall(sel_str, item.text(), re.S)))

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函数方法
页: [1]
查看完整版本: PyQt5 ListView列表加载太慢如何解决?