【发布时间】:2016-09-07 13:47:00
【问题描述】:
我想在与我的其余代码不同的线程中运行进度条,但我想控制进度条如何从我的主线程更新。
这是可能的吗?
这是我目前所拥有的:
import time
from PySide import QtGui
from PySide import QtCore
from PySide import QtUiTools
class progressBar(QtGui.QDialog, QtCore.QThread):
def __init__(self, window, title=None):
super(progressBar, self).__init__(window)
QtCore.QThread.__init__(self)
self.title = title or 'Progress'
self.setupUi()
self.show()
def setupUi(self):
self.setObjectName("Thinking")
self.gridLayout = QtGui.QGridLayout(self)
self.gridLayout.setObjectName("gridLayout")
self.progressBar = QtGui.QProgressBar(self)
self.gridLayout.addWidget(self.progressBar, 0, 0, 1, 1)
# ADJUSTMENTS
self.setMaximumSize(280, 50)
self.setMinimumSize(280, 50)
self.setWindowTitle(self.title)
def increase(self, inc):
self.progressBar.setProperty("value", inc)
time.sleep(0.01)
def run(self):
for i in range(1,101):
self.increase(i)
progressThread = progressBar(QtGui.QApplication.activeWindow())
progressThread.start()
这似乎是在线程内正确运行进度条,但它完全由 run 函数控制。
我尝试删除 run 函数并将此代码添加到我的主线程:
progressThread = progressBar(QtGui.QApplication.activeWindow())
progressThread.start()
for i in range(1,101):
progressThread.increase(i)
但这似乎不起作用。
对此的任何帮助都会很棒...谢谢
【问题讨论】:
-
请注意,
QThreads 存在于创建它们的线程中(在本例中为主线程),不在它们管理的线程中。这段代码仍然在主线程中完成所有工作。您应该调用进度条的moveToThread方法将其移动到由QThread对象管理的线程。但也要注意,在主线程以外的线程中拥有 GUI 对象通常不是一个好主意。 -
除了主线程/事件循环之外,您不能有 GUI 对象。您可以在另一个线程中跟踪进度并向主线程发送信号以更新进度条。
-
您还可以通过槽和信号进行更新,以允许跨线程更新。
标签: python pyqt pyside qthread nuke