Linux
Python 3.7.3
python-pyqt5 5.11.3+dfsg-1+b3
Имеется код для демонстрации проблемы:
При нажатии кнопки Redraw часы останавливаются (оно и понятно, всё в одном потоке)
Вопрос: как обновлять QListWidget в отдельном потоке?
p.s. Этого нет в демонстрационном коде, но в реальном приложении (где используется ещё и setItemWidget) при попытке ввести многопоточность происходит следующее:
Хотелось бы избежать и этого.
Python 3.7.3
python-pyqt5 5.11.3+dfsg-1+b3
Имеется код для демонстрации проблемы:
Python:
#!/usr/bin/env python3
import sys
import time
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QApplication, QWidget, QListWidget, QPushButton, QLabel
def redraw():
list.clear()
for i in range(1000000):
test = QLabel(str(i))
list.addItem(str(i))
def show_time():
clock.setText(time.strftime('%d.%m.%y %H:%M:%S', time.localtime()))
app = QApplication(sys.argv)
root = QWidget()
root.resize(600, 600)
list = QListWidget(root)
list.resize(600, 500)
for i in range(5):
list.addItem(str(i))
clock = QLabel(root)
clock.move(300, 520)
clock.resize(300, 30)
show_time()
btn = QPushButton('Redraw', root)
btn.clicked.connect(redraw)
btn.move(300, 570)
timer = QTimer()
timer.timeout.connect(show_time)
timer.start(1000)
root.show()
sys.exit(app.exec_())
Вопрос: как обновлять QListWidget в отдельном потоке?
p.s. Этого нет в демонстрационном коде, но в реальном приложении (где используется ещё и setItemWidget) при попытке ввести многопоточность происходит следующее:
Код:
QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::installEventFilter(): Cannot filter events for objects in a different thread.