下面的代码创建了一个包含10,000行的QTableView
窗口。
通过调用相同的update()
函数,视图每秒刷新一次。不幸的是,这个更新过程使整个窗口锁定并显着降低窗口的响应速度。
我想知道是否有办法将update()
函数的调用转移到另一个Thread,这样它就不会阻塞主窗口?
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_()