Многопоточность в pyqt5
Как можно реализовать в нём многопоточность? Стандартный threading не работает, а если просто так - медленно прогружается форма.
Есть такой код:
class Main(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.hline = QVBoxLayout()
self.tex = QLabel('Lorem ipsum dolor sit amet')
self.hline.addWidget(self.tex)
self.setLayout(self.hline)
for _ in range(4):
app = QGroupBox()
h = QHBoxLayout()
app.setLayout(h)
for q in range(4):
appp = QGroupBox(str(q))
v = QVBoxLayout()
appp.setLayout(v)
image= QLabel()
getweb = QImage()
getweb.loadFromData(requests.get('изображение').content)
pixmap = QPixmap(getweb)
image.setPixmap(pixmap)
image.setMaximumSize(64, 64)
v.addWidget(image)
h.addWidget(appp)
self.hline.addWidget(app)
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
QApplication.processEvents() -
обрабатывает некоторые ожидающие события для вызывающего потока.
Вы можете иногда вызывать эту функцию,
когда ваша программа занята выполнением длительной операции.
import sys
import requests
from PyQt5.Qt import *
class Main(QWidget):
def __init__(self):
super().__init__()
self.images = [
'https://www.python.org/static/img/python-logo.png',
'https://laguna-akul.ru/upload/003/u379/f4/61/8f68d93a.jpg',
'http://www.google.com/favicon.ico',
'https://img.icons8.com/ios/452/phone.png',
]
self.hline = QVBoxLayout(self)
self.tex = QLabel('Lorem ipsum dolor sit amet')
self.hline.addWidget(self.tex, alignment=Qt.AlignHCenter | Qt.AlignTop)
# self.initUI()
QTimer.singleShot(0, self.initUI) # !!!
def initUI(self):
for _ in range(4):
app = QGroupBox(f'Hello GroupBox {_+1}')
h = QHBoxLayout(app)
self.hline.addWidget(app)
self.hline.addStretch(_)
# for q in range(4):
for q, href in enumerate(self.images): # !!!
appp = QGroupBox(str(q+1))
v = QVBoxLayout(appp)
image = QLabel()
getweb = QImage()
getweb.loadFromData(requests.get(href).content)
pixmap = QPixmap(getweb)
image.setPixmap(pixmap.scaled(64, 64, Qt.KeepAspectRatio)) # !!!
# image.setMaximumSize(64, 64)
v.addWidget(image, alignment=Qt.AlignCenter)
h.addWidget(appp, alignment=Qt.AlignLeft)
QApplication.processEvents() # !!!!!!
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setFont(QFont("Times", 12, QFont.Bold))
w = Main()
w.resize(400, 600)
w.show()
sys.exit(app.exec_())
