2014-09-23 81 views
0

我试图通过将一些阻止代码移动到单独的QThread来使我的PyQt4程序更具响应性。由于没有工作,我创造了这个小例子,作为示范:pyqt代码阻塞,虽然移动到不同的QThread

import sys 
import time 
from PyQt4 import QtCore, QtGui 


class Sleeper(QtCore.QObject): 

    def __init__(self): 
     super(Sleeper, self).__init__() 
     self.timer = QtCore.QTimer() 
     self.timer.timeout.connect(self.sleep) 
     self.timer.start(1000) 

    def sleep(self): 
     time.sleep(1) 


class MyGUI(QtGui.QMainWindow): 

    def __init__(self, parent=None): 
     super(MyGUI, self).__init__(parent) 
     self.button = QtGui.QPushButton("hello", self) 
     self.sleeper = Sleeper() 
     self.thread = QtCore.QThread() 
     self.sleeper.moveToThread(self.thread) 
     self.thread.start() 


if __name__ == "__main__": 
    qapp = QtGui.QApplication(sys.argv) 
    my_gui = MyGUI() 
    my_gui.show() 
    qapp.exec_() 

这段代码的问题是睡眠命令仍然让用户界面。我发现它在我创建,连接并运行Sleeper类之外的QTimer时按预期工作,但我不明白为什么。

回答

3

当对象位于GUI线程中时调用connect,因此事件处理程序也将在GUI线程中执行。尝试先移到线程,然后创建连接。

class Sleeper(QtCore.QObject): 

    def __init__(self): 
     super(Sleeper, self).__init__() 
     self.timer = QtCore.QTimer() 

    def initialize(self): # Creating the connection and starting separately 
     self.timer.timeout.connect(self.sleep) 
     self.timer.start(1000) 

    def sleep(self): 
     time.sleep(1) 

class MyGUI(QtGui.QMainWindow): 

    def __init__(self, parent=None): 
     super(MyGUI, self).__init__(parent) 
     self.button = QtGui.QPushButton("hello", self) 
     self.sleeper = Sleeper() 
     self.thread = QtCore.QThread() 
     self.sleeper.moveToThread(self.thread) # Move to thread 
     self.sleeper.initialize() # Create connection now 
     self.thread.start() 

此外,检查: Qt connection type between threads: why does this work?

+0

我使用这段代码仍然得到堵塞的UI。 – nvd 2014-10-28 22:35:37