Python QlistWidget图标-更快加载

Python QlistWidget图标-更快加载,python,pyside2,Python,Pyside2,我正在用图标填充QlistWidget,我注意到在加载窗口时有一个延迟。我想知道是否有一种方法可以生成半分辨率图标,或者其他方法可以加快窗口生成时间 texture_item = QtWidgets.QListWidgetItem(texture) texture_pixmap = QtGui.QPixmap(image_path) texture_icon = QtGui.QIcon() self.list_widget_left.setIconSize(QtCore.QS

我正在用图标填充QlistWidget,我注意到在加载窗口时有一个延迟。我想知道是否有一种方法可以生成半分辨率图标,或者其他方法可以加快窗口生成时间

texture_item = QtWidgets.QListWidgetItem(texture)
texture_pixmap = QtGui.QPixmap(image_path)
texture_icon = QtGui.QIcon()          
self.list_widget_left.setIconSize(QtCore.QSize(105,105))
texture_item.setFont(QtGui.QFont('SansSerif', 10))
texture_icon.addPixmap(texture_pixmap)
texture_item.setIcon(texture_icon)
self.list_widget_left.addItem(texture_item)
texture_item.setTextAlignment(Qt.AlignBottom)

有几个方面可以产生延迟:

  • 这些图像很重,解决方法是使用较轻的图标
  • 如果有许多图像在同一个循环中迭代,那么一个可能的解决方案是提供一个小的延迟,以便一点一点地加载图像,从而避免显示的视觉延迟
导入操作系统
从PySide2导入QtCore、QtGui、QtWidgets
进口香菇2
_循环_文件的定义(路径,间隔=100,扩展名=(),父项=None,objectName=“”):
计时器=QtCore.QTimer(父级=父级,单次激发=真,间隔=间隔)
如果对象名称:
timer.setObjectName(objectName)
loop=QtCore.QEventLoop(计时器)
timer.timeout.connect(loop.quit)
计时器。销毁。连接(循环。退出)
对于os.walk(路径)中的根、目录和文件:
对于文件中的名称:
base,ext=os.path.splitext(名称)
如果扩展:
如果扩展名中有ext:
如果shiboken2.isValid(计时器):
timer.start()
loop.exec()
生成os.path.join(根,名称)
其他:
生成os.path.join(根,名称)
类MainWindow(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级)
self.list_widget=qtwidts.QListWidget()
self.list\u widget.setViewMode(qtwidts.QListView.IconMode)
self.list_widget.setIconSize(QtCore.QSize(128128))
self.list_widget.setResizeMode(qtwidts.QListView.Adjust)
self.list\u widget.setFlow(qtwidts.QListView.TopToBottom)
self.setCentralWidget(self.list\u小部件)
自我调整大小(640480)
QtCore.QTimer.singleShot(0,self.load_图标)
@QtCore.Slot()
def加载图标(自身):
对于for_循环_文件中的路径(“.”,扩展名=(“.png”,“jpg”),parent=self,objectName=“icon_timer”,间隔=30):
it=QtWidgets.QListWidgetItem()
it.setIcon(QtGui.QIcon(路径))
self.list\u widget.addItem(it)
def关闭事件(自身、事件):
timer=self.findChild(QtCore.QTimer,“图标计时器”)
如果计时器不是无:
timer.deleteLater()
超级(主窗口,自我)。关闭事件(事件)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=主窗口()
w、 show()
sys.exit(app.exec_())
从PySide2导入QtCore、QtGui、QtWidgets
进口香菇2
_循环_文件的定义(路径,间隔=100,父项=None,objectName=“”):
计时器=QtCore.QTimer(父级=父级,单次激发=真,间隔=间隔)
如果对象名称:
timer.setObjectName(objectName)
loop=QtCore.QEventLoop(计时器)
timer.timeout.connect(loop.quit)
计时器。销毁。连接(循环。退出)
对于路径中的路径:
如果shiboken2.isValid(计时器):
timer.start()
loop.exec()
屈服路径
类MainWindow(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级)
self.list_widget=qtwidts.QListWidget()
self.list\u widget.setViewMode(qtwidts.QListView.IconMode)
self.list_widget.setIconSize(QtCore.QSize(128128))
self.list_widget.setResizeMode(qtwidts.QListView.Adjust)
self.list\u widget.setFlow(qtwidts.QListView.TopToBottom)
self.setCentralWidget(self.list\u小部件)
自我调整大小(640480)
QtCore.QTimer.singleShot(0,self.load_图标)
@QtCore.Slot()
def加载图标(自身):
路径=[“icon1.png”、“icon2.png”、“icon3.png”、“icon4.png”]
对于for_loop_文件中的路径(路径,parent=self,objectName=“icon_timer”,间隔=30):
it=QtWidgets.QListWidgetItem()
it.setIcon(QtGui.QIcon(路径))
self.list\u widget.addItem(it)
def关闭事件(自身、事件):
timer=self.findChild(QtCore.QTimer,“图标计时器”)
timer.deleteLater()
超级(主窗口,自我)。关闭事件(事件)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=主窗口()
w、 show()
sys.exit(app.exec_())

您上载了多少个图标,每个图标的平均重量是多少?如何加载图像?我正在加载5到15个图像,每个图像的重量为4000x4000。我在上面包含了一个代码示例,以显示如何加载它们。我也会看看你的例子并分析你的建议。如我的回答所示,使用较小的图标,为什么你需要4000x4000图像?不幸的是,这方面有点超出我的控制。我在一个设施中工作,那里的纹理大小就是我正在使用的纹理大小,而调整它们的大小不是我可以控制的。我正在制作工具来处理管道中使用的图像。