QListWidget 选择正在减慢应用程序的速度?
QListWidget selection is slowing down app?
我正在编写一个应用程序,其中 QListWidget
用于使用 QMovie
显示 gif 预览。一切正常,但当我按下按钮并重新填充 ListWidget 时,速度越来越慢。我在想调用 QListWidget.clear()
会从内存中删除对象,但我不确定是否真的发生了。也许有一种更有效的方法可以做到这一点,但我在其他地方找不到任何东西。这是一些代码(我不能提供 gif 文件,但任何 gif 都可以):
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
import os, glob
class gifPreviewWidget(QWidget):
def __init__(self, gifPath, parent=None):
super(gifPreviewWidget, self).__init__(parent)
label = QLabel()
label.setScaledContents(True)
movie = QMovie(gifPath)
movie.setSpeed(100)
label.setMovie(movie)
movie.start()
nameLabel = QLabel(os.path.split(gifPath)[1].split('.')[0])
layout = QVBoxLayout()
layout.addWidget(label)
print(gifPath)
self.setLayout(layout)
class gifDelegate(QItemDelegate):
def __init__(self, parent=None, *args):
QItemDelegate.__init__(self, parent, *args)
def paint(self, painter, option, index):
painter.save()
# set background color
painter.setPen(QPen(Qt.NoPen))
# set selection color
if option.state & QStyle.State_Selected:
painter.setBrush(QBrush(Qt.blue))
else:
painter.setBrush(QBrush(Qt.NoBrush))
painter.drawRect(option.rect)
painter.restore()
class MainUiClass(QtWidgets.QWidget):
def __init__(self, parent=None):
super(MainUiClass, self).__init__(parent)
self.layout=QVBoxLayout()
self.gifDelegate = gifDelegate()
self.previewListWidget = QListWidget()
self.previewListWidget.setViewMode(QtWidgets.QListView.IconMode)
self.previewListWidget.setResizeMode(QListWidget.Adjust)
self.previewListWidget.setSelectionMode(QAbstractItemView.ExtendedSelection)
self.previewListWidget.setMovement(QListView.Static)
self.previewListWidget.setSpacing(1)
self.previewListWidget.setItemDelegate(self.gifDelegate)
self.pushButton = QPushButton('change gif dir')
self.layout.addWidget(self.previewListWidget)
self.layout.addWidget(self.pushButton)
self.setLayout(self.layout)
self.pushButton.clicked.connect(self.onCategoryClick)
def onCategoryClick(self):
filePath = '/PATH/TO/LOTS/OF/GIFS'
print(filePath+'/*.gif')
glob.glob(filePath+'/*.gif')
if glob.glob(filePath+'/*.gif') != []:
print('ok')
gifList = glob.glob(filePath+'/*.gif')
self.previewListWidget.clear()
for gif in gifList:
item=QListWidgetItem(self.previewListWidget)
itemWidget = gifPreviewWidget(gif)
item.setSizeHint(itemWidget.sizeHint())
self.previewListWidget.addItem(item)
self.previewListWidget.setItemWidget(item,itemWidget)
if __name__ == '__main__':
w = MainUiClass()
w.show()
sys.exit(app.exec_())
经常按下按钮,应用开始变慢很多。
通常,您不必在要删除它时显式停止 QMovie
。但是在这里,它没有被删除因为它没有停止(它还在播放)。
我想当你使用一种带有垃圾收集器的语言时,这种意想不到的行为就是你付出代价的。
解决方法:当项目被删除时停止影片。添加
class gifPreviewWidget(QWidget):
def __del__(self):
self.movie.stop()
我正在编写一个应用程序,其中 QListWidget
用于使用 QMovie
显示 gif 预览。一切正常,但当我按下按钮并重新填充 ListWidget 时,速度越来越慢。我在想调用 QListWidget.clear()
会从内存中删除对象,但我不确定是否真的发生了。也许有一种更有效的方法可以做到这一点,但我在其他地方找不到任何东西。这是一些代码(我不能提供 gif 文件,但任何 gif 都可以):
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
import os, glob
class gifPreviewWidget(QWidget):
def __init__(self, gifPath, parent=None):
super(gifPreviewWidget, self).__init__(parent)
label = QLabel()
label.setScaledContents(True)
movie = QMovie(gifPath)
movie.setSpeed(100)
label.setMovie(movie)
movie.start()
nameLabel = QLabel(os.path.split(gifPath)[1].split('.')[0])
layout = QVBoxLayout()
layout.addWidget(label)
print(gifPath)
self.setLayout(layout)
class gifDelegate(QItemDelegate):
def __init__(self, parent=None, *args):
QItemDelegate.__init__(self, parent, *args)
def paint(self, painter, option, index):
painter.save()
# set background color
painter.setPen(QPen(Qt.NoPen))
# set selection color
if option.state & QStyle.State_Selected:
painter.setBrush(QBrush(Qt.blue))
else:
painter.setBrush(QBrush(Qt.NoBrush))
painter.drawRect(option.rect)
painter.restore()
class MainUiClass(QtWidgets.QWidget):
def __init__(self, parent=None):
super(MainUiClass, self).__init__(parent)
self.layout=QVBoxLayout()
self.gifDelegate = gifDelegate()
self.previewListWidget = QListWidget()
self.previewListWidget.setViewMode(QtWidgets.QListView.IconMode)
self.previewListWidget.setResizeMode(QListWidget.Adjust)
self.previewListWidget.setSelectionMode(QAbstractItemView.ExtendedSelection)
self.previewListWidget.setMovement(QListView.Static)
self.previewListWidget.setSpacing(1)
self.previewListWidget.setItemDelegate(self.gifDelegate)
self.pushButton = QPushButton('change gif dir')
self.layout.addWidget(self.previewListWidget)
self.layout.addWidget(self.pushButton)
self.setLayout(self.layout)
self.pushButton.clicked.connect(self.onCategoryClick)
def onCategoryClick(self):
filePath = '/PATH/TO/LOTS/OF/GIFS'
print(filePath+'/*.gif')
glob.glob(filePath+'/*.gif')
if glob.glob(filePath+'/*.gif') != []:
print('ok')
gifList = glob.glob(filePath+'/*.gif')
self.previewListWidget.clear()
for gif in gifList:
item=QListWidgetItem(self.previewListWidget)
itemWidget = gifPreviewWidget(gif)
item.setSizeHint(itemWidget.sizeHint())
self.previewListWidget.addItem(item)
self.previewListWidget.setItemWidget(item,itemWidget)
if __name__ == '__main__':
w = MainUiClass()
w.show()
sys.exit(app.exec_())
经常按下按钮,应用开始变慢很多。
通常,您不必在要删除它时显式停止 QMovie
。但是在这里,它没有被删除因为它没有停止(它还在播放)。
我想当你使用一种带有垃圾收集器的语言时,这种意想不到的行为就是你付出代价的。
解决方法:当项目被删除时停止影片。添加
class gifPreviewWidget(QWidget):
def __del__(self):
self.movie.stop()