启动时将参数传递给 pyqt 线程 [英] Passing parameter to a pyqt thread when started
问题描述
有没有什么办法可以在线程启动时(.start)给QThread传递一个参数?
Is there any way we can pass a parameter to QThread when the thread is started (.start) ?
我发现了一个在 stackoverflow 中使用 pyqt 线程的示例,但我想知道如何传递参数,以防我希望工作线程处理我传递给它的 run() 函数的数据.
I found an example of using pyqt thread in stackoverflow, but I was wondering how to pass a parameter, in case I want the worker thread to process a data that I pass to its run() function.
我参考的帖子:PyQt 进度条忙指示
代码:
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)
我想在调用 .start 时传递一个变量,例如
I want to pass a variable when calling .start such as
self.myLongTask.start(myvar)
.
.
def run(self, myvar):
当然,pyqt 不允许这样做.
but of course, pyqt does not allow that.
推荐答案
您不能将参数传递给 run
但您可以像这样将参数传递给它的构造函数:
You can not pass argument to run
but you can pass argument to it's constructor like this:
class TaskThread(QtCore.QThread):
notifyProgress = QtCore.pyqtSignal(int)
def __init__(self, myvar, parent=None):
QThread.__init__(self, parent)
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)
这篇关于启动时将参数传递给 pyqt 线程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!