2015-10-15 177 views
2

当线程启动时(.start)有什么办法可以将参数传递给QThread吗?启动时将参数传递给pyqt线程

我发现了一个在stackoverflow中使用pyqt线程的例子,但我想知道如何传递一个参数,以防我希望工作线程处理传递给它的run()函数的数据。

我指的是后:Busy indication with PyQt progress bar

代码:

class MyCustomWidget(QtGui.QWidget): 

    def __init__(self, parent=None): 
     super(MyCustomWidget, self).__init__(parent) 
     layout = QtGui.QVBoxLayout(self)  

     self.progressBar = QtGui.QProgressBar(self) 
     self.progressBar.setRange(0,100) 
     button = QtGui.QPushButton("Start", self) 
     layout.addWidget(self.progressBar) 
     layout.addWidget(button) 

     button.clicked.connect(self.onStart) 

     self.myLongTask = TaskThread() 
     self.myLongTask.notifyProgress.connect(self.onProgress) 


    def onStart(self): 
     self.myLongTask.start() 

    def onProgress(self, i): 
     self.progressBar.setValue(i) 


class TaskThread(QtCore.QThread): 
    notifyProgress = QtCore.pyqtSignal(int) 
    def run(self): 
     for i in range(101): 
      self.notifyProgress.emit(i) 
      time.sleep(0.1) 

我想打电话。开始如

self.myLongTask.start(myvar) 
. 
. 
def run(self, myvar): 

当然,但当传递变量,PyQt的呢不允许。

+0

你有什么不想理由一旦线程已经启动,使用信号/插槽机制传递参数? – paisanco

+0

据我了解,像上面的代码信号/插槽可以用来从TaskThread发送到MyCustomWidget的参数。我想要的是从MyCustomWidget发送到TaskThread的参数。 – electro

+1

两种方式都可以发信号/插槽,但为什么不在线程实例化时传递参数呢? –

回答

1

你不能传递参数run但你可以传递参数给它的构造是这样的:

class TaskThread(QtCore.QThread): 
    def __init__(self, myvar, parent=None): 
     QThread.__init__(self, parent) 
     self.notifyProgress = QtCore.pyqtSignal(int) 
     self.myvar = myvar 
    def run(self): 
     #use self.myvar in your run 
     for i in range(101): 
      self.notifyProgress.emit(i) 
      time.sleep(0.1) 

,并在MyCustomWidget类:

class MyCustomWidget(QtGui.QWidget): 

    def __init__(self, parent=None): 
     super(MyCustomWidget, self).__init__(parent) 
     layout = QtGui.QVBoxLayout(self)  

     self.progressBar = QtGui.QProgressBar(self) 
     self.progressBar.setRange(0,100) 
     button = QtGui.QPushButton("Start", self) 
     layout.addWidget(self.progressBar) 
     layout.addWidget(button) 

     button.clicked.connect(self.onStart) 
     ############################################################## 
     #and pass your argumetn to it's constructor here 
     self.myLongTask = TaskThread(myvar=myargument) 
     ############################################################## 
     self.myLongTask.notifyProgress.connect(self.onProgress) 


    def onStart(self): 
     self.myLongTask.start() 

    def onProgress(self, i): 
     self.progressBar.setValue(i) 
+0

感谢您的代码。它实际上给出了错误:AttributeError:'PyQt4.QtCore.pyqtSignal'对象没有'连接'属性 但是,如果我们将self.notifyProgress = QtCore.pyqtSignal(int)移到外部和上面__init__,它就会起作用。 – electro