【发布时间】:2022-01-22 19:18:49
【问题描述】:
我正在尝试以图标模式将 100,000 张图像加载到 QtWidgets.QListWidget 中。我知道这是大量照片,但我需要将它们全部加载,因为我正在制作一个图像查看应用程序。我正在通过QtGui.QIcon 加载所有图像,并且它需要存储所有这些图像的内存量很大。有谁知道如何以不同方式加载这些图像以减少我正在使用的 RAM 量或更改设置以减少 RAM?
import sys
import CustomWidgets as cw
import platform
from PyQt5 import QtCore, QtGui, QtWidgets
import os
import threading
# GUI FILE
from PhotosPage import Ui_MainWindow
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# connect tab Pages
self.ui.PageButton_Photos.clicked.connect(lambda: self.ui.stackedWidget.setCurrentWidget(self.ui.PhotosPage))
self.ui.PageButton_Albums.clicked.connect(lambda: self.ui.stackedWidget.setCurrentWidget(self.ui.AlbumsPage))
self.ui.PageButton_People.clicked.connect(lambda: self.ui.stackedWidget.setCurrentWidget(self.ui.PeoplePage))
self.ui.PageButton_Groups.clicked.connect(lambda: self.ui.stackedWidget.setCurrentWidget(self.ui.GroupsPage))
self.ui.AlbumInfoFrame.hide()
# # Create album Cover - test
# cw.AlbumCover(self)
self.ui.listWidget.setIconSize(QtCore.QSize(128, 128))
threading.Thread(target=self.loadImgs, name="Loading Images").start()
self.show()
def loadImgs(self):
for i in os.listdir("D:/iPhone Pics"):
item = QtWidgets.QListWidgetItem()
photo = QtGui.QIcon("D:/iPhone Pics/"+i)
item.setIcon(photo)
self.ui.listWidget.addItem(item)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())
【问题讨论】:
-
如果您正在加载所有图像,程序显然需要全部大小。没有简单的解决方案,每个画廊类型的程序都有自己的处理方式,通过使用自定义缓存和优化来提高性能并避免过多的内存使用。您必须自己找到它,并且您可能需要使用带有 QListView 的自定义模型(它可以使用 QListWidget 来完成,但您需要仔细实现项目委托)。此外,您应该从不从另一个线程访问 UI 元素。
-
不必一次加载 100,000 张图像。图像查看器永远无法真正显示那么多图像,因为屏幕上没有足够的空间。您应该只加载足够的图像来填充显示区域(加上两边的几页),并删除该范围之外的所有先前加载的图像以限制内存使用。见this question 和this pyqt5 example。
标签: python python-3.x qt pyqt pyqt5