Python PyQt5在QThread上为QPushButton加载图像

Python PyQt5在QThread上为QPushButton加载图像,python,pyqt5,qthread,qpushbutton,qicon,Python,Pyqt5,Qthread,Qpushbutton,Qicon,我有一个UI,它可以加载很多按钮,都带有图像,问题是,它需要很长的时间,所以我尝试将它放入QThread,我让它工作,但没有速度差异,所以我尝试了不同的解决方案,但现在线程无法启动 代码: 导入系统 导入操作系统 从PyQt5导入* 从PyQt5.QtGui导入* 从PyQt5.QtCore导入* 从PyQt5.QtWidgets导入* 从PyQt5导入QtCore、QtGui、QtPrintSupport、QtWidgets、uic #我已经尝试过使用QThread来实现这一点,但仍然花费了相

我有一个UI,它可以加载很多按钮,都带有图像,问题是,它需要很长的时间,所以我尝试将它放入
QThread
,我让它工作,但没有速度差异,所以我尝试了不同的解决方案,但现在线程无法启动

代码:

导入系统 导入操作系统 从PyQt5导入* 从PyQt5.QtGui导入* 从PyQt5.QtCore导入* 从PyQt5.QtWidgets导入* 从PyQt5导入QtCore、QtGui、QtPrintSupport、QtWidgets、uic #我已经尝试过使用QThread来实现这一点,但仍然花费了相同的时间。 类LoadImageThumbnailsHead(QThread): 定义初始化(self、列表按钮、列表路径): QThread.\uuuu init\uuuu(self) self.listButtons=listButtons self.listPaths=listPaths def运行(自): self.process\u image\u Thread() def进程图像线程(自): 对于枚举中的i,j(self.listButtons): j、 setIcon(QIcon(self.listPaths[i])) j、 setIconSize(QSize(150-6,60-6)) 课堂应用程序(QDialog): 定义初始化(自): super()。\uuuu init\uuuuu() self.title='PyQt5布局-pythonspot.com' self.left=10 self.top=10 自宽=320 自身高度=100 self.images_path=[] self.button_图像=[] self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left、self.top、self.width、self.height) self.createGridLayout() windowLayout=QVBoxLayout() windowLayout.addWidget(self.horizontalGroupBox) self.setLayout(windowLayout) self.show() def createGridLayout(自身): self.horizontalGroupBox=QGroupBox(“网格”) 布局=QGridLayout() 布局。setColumnStretch(1,4) 布局。设置柱拉伸(2,4) 对于范围(100)内的i: self.btnImage=QPushButton() self.btnImage.setObjectName('btnImage') self.images\u path.append(os.path.dirname( abspath(_文件__))+'view.png') # ! 我也尝试过使用带有可点击标签的像素地图,但没有什么不同。 #pixmap=QPixmap(os.path.dirname(os.path.abspath(_文件__))+image_位置[i]) #pixmap=pixmap.scaled(60300,Qt.KeepAspectRatio,Qt.FastTransformation) #self.btnImage.setPixmap(pixmap) # ! 启用此选项将加载图像,但加载速度非常慢 #self.btnImage.setIcon(QIcon(os.path.dirname(os.path.abspath(_文件__))+'/view.png')) #self.btnImage.setIconSize(QSize(150-6,60-6)) self.button\u images.append(self.btnImage) layout.addWidget(self.btnImage,i,0) # ! 这将启动QThread 转换器=LoadImageThumbnailsHead( self.button\u图像,self.images\u路径) converter.start() self.horizontalGroupBox.setLayout(布局) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app=QApplication(sys.argv) ex=App() sys.exit(app.exec_()) 为了解释更多我想要的内容,我想在UI加载后启动一个
QThread
,该
QThread
将所有图像加载到每个按钮上。问题是:它现在不起作用


我遇到的另一个问题是,当我得到
QThread
时,UI等待它完成,然后突然出现了所有东西。我希望
QThread
完全独立,如果愿意的话,可以看到一个接一个地加载所有图像。

线程不会加速任何任务但执行不阻止任何线程的任务。鉴于上述情况,如果我有n个“任务”,并且每个任务都在“n”个线程中执行,那么总执行时间将是1个任务,也就是说,没有任务被加速,但任务被重新分配。总之:如果您想加速任务,那么线程不是默认选项,因为它取决于应用程序

另一方面,映像的加载不消耗时间,但有许多任务消耗的时间很少,总的来说相当于消耗大量时间的任务,不幸的是,该任务无法在另一个线程或进程中执行,因为GUI的元素不是线程安全的

一种解决方法是,负载是每T秒由一小群n个元素组成的,因此总任务将被分配,用户将不会观察到任何滞后效应

导入操作系统
导入系统
从PyQt5.QtCore导入QSize、QTimer
从PyQt5.QtGui导入QIcon
从PyQt5.QtWidgets导入(
QApplication,
QDialog,
QGridLayout,
QGroupBox,
QPushButton,
QVBoxLayout,
)
课堂应用程序(QDialog):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.title=“PyQt5布局-pythonspot.com”
self.left=10
self.top=10
自宽=320
自身高度=100
self.images_path=[]
self.button_图像=[]
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left、self.top、self.width、self.height)
self.createGridLayout()
windowLayout=QVBoxLayout(自)
windowLayout.addWidget(self.horizontalGroupBox)
国际热核聚变实验堆=国际热核聚变实验堆(范围(100))
self.\u timer=QTimer(间隔=10,超时=self.lazy\u加载)
self.\u timer.start()
def createGridLayout(自身):
self.horizontalGroupBox=QGroupBox(“网格”)
self.grid_layout=QGridLayout()
self.grid_layout.setColumnStretch(1,4)
self.grid_layout.setColumnStretch(2,4)
self.horizontalGroupBox.setLayout(self.grid\u布局)
def惰性_加载(自):
尝试:
i=下一个(自身)
除停止迭代外:
self.\u timer.stop()
其他:
btn=QPushButton()
image\u path=os.path.join(os.path.abspath(\uu文件);“view.png”)
btn.设置图标(QIcon(图像路径))