如何将GUI更新移动到另一个QThread

时间:2017-01-09 23:11:02

标签: python pyqt qthread

下面的代码创建了一个包含10,000行的QTableView窗口。 通过调用相同的update()函数,视图每秒刷新一次。不幸的是,这个更新过程使整个窗口锁定并显着降低窗口的响应速度。

我想知道是否有办法将update()函数的调用转移到另一个Thread,这样它就不会阻塞主窗口?

enter image description here

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进程移动到另一个线程。但不幸的是,即使更新过程发生在另一个线程中(日志记录打印出线程名称),滞后仍然存在:

enter image description here

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_()

0 个答案:

没有答案