Как переместить обновление GUI в другой QThread
Код ниже создает один QTableView
окно с 10000 строк. Каждую секунду представление обновляется, вызывая один и тот же update()
функция. К сожалению, этот процесс обновления делает блокировку всего окна и заметно замедляет отзывчивость окна.
Интересно, есть ли способ перевести звонок на update()
функция в другой поток, чтобы он не блокировал главное окно?
from PyQt4 import QtCore, QtGui
app=QtGui.QApplication([])
items = ['item_%04d'%i for i in range(10000)]
def update():
view.model().sourceModel().clear()
for i, item in enumerate(items):
for column_number in range(5):
item = QtGui.QStandardItem(item)
model.setItem(i, column_number, item)
view = QtGui.QTableView()
model = QtGui.QStandardItemModel(len(items), 5)
proxy = QtGui.QSortFilterProxyModel()
proxy.setSourceModel(model)
view.setModel(proxy)
timer = QtCore.QTimer()
view.connect(timer, QtCore.SIGNAL("timeout()"), update)
timer.start(1000)
view.show()
app.exec_()
ИЗМЕНЕНО ПОЗЖЕ:
Код ниже - моя попытка переместить update GUI
процесс в другой поток. Но, к сожалению, задержка все еще существует, даже если процесс обновления происходит в другом потоке (регистрация выводит имя потока):
from PyQt4 import QtCore, QtGui
import threading, time, logging
logging.basicConfig(format='%(threadName)s:%(message)s', level=logging.DEBUG)
app=QtGui.QApplication([])
items = ['item_%04d'%i for i in range(10000)]
def worker():
while True:
view.model().sourceModel().clear()
for i, item in enumerate(items):
for column_number in range(5):
item = QtGui.QStandardItem(item)
model.setItem(i, column_number, item)
time.sleep(1)
logging.info('updaing gui...')
view = QtGui.QTableView()
model = QtGui.QStandardItemModel(len(items), 5)
proxy = QtGui.QSortFilterProxyModel()
proxy.setSourceModel(model)
view.setModel(proxy)
t = threading.Thread(target=worker)
t.setDaemon(True)
logging.info('starting worker...')
t.start()
view.show()
app.exec_()