PyQt 类 多进程
PyQt Classes Multiprocess
我希望能够实例化多个 QWidget() 类型 类,每个都在一个单独的进程中。就像 Google Chrome 在您打开新标签页时所做的那样。
这在 python 中可行吗?
GUI元素(包括QWidget
)只能在主线程中创建。
但是,您可以将每个选项卡的模型和业务逻辑放在单独的线程中,并使用 Signals
和 Slots
分别与主线程通信。 Qt documentation for QThreads
提供了一个 Worker Pattern 的例子。
这样,即使任何工作进程挂起,也不会影响主 GUI 线程的响应能力。
class MyTab(QtGui.QWidget):
def __init__(self, parent):
...
self.worker = Worker()
self.thread = QtCore.QThread(self)
self.worker.moveToThread(self.thread)
self.worker.resultReady.connect(self.handleResult)
self.thread.start()
def callSomeFunction(self):
QtCore.QMetaObject.invokeMethod(self.worker, 'someFunction', QtCore.Qt.QueuedConnection, QtCore.Q_ARG(str, 'arg1'))
@QtCore.pyqtSlot(object)
def handleResult(self, result):
... # do stuff with result
class Worker(QtCore.QObject):
resultReady = QtCore.pyqtSignal(object)
@QtCore.pyqtSlot(str)
def someFunction(self, arg):
...
self.resultReady.emit({'func': 'someFunction', 'result': True})
我希望能够实例化多个 QWidget() 类型 类,每个都在一个单独的进程中。就像 Google Chrome 在您打开新标签页时所做的那样。
这在 python 中可行吗?
GUI元素(包括QWidget
)只能在主线程中创建。
但是,您可以将每个选项卡的模型和业务逻辑放在单独的线程中,并使用 Signals
和 Slots
分别与主线程通信。 Qt documentation for QThreads
提供了一个 Worker Pattern 的例子。
这样,即使任何工作进程挂起,也不会影响主 GUI 线程的响应能力。
class MyTab(QtGui.QWidget):
def __init__(self, parent):
...
self.worker = Worker()
self.thread = QtCore.QThread(self)
self.worker.moveToThread(self.thread)
self.worker.resultReady.connect(self.handleResult)
self.thread.start()
def callSomeFunction(self):
QtCore.QMetaObject.invokeMethod(self.worker, 'someFunction', QtCore.Qt.QueuedConnection, QtCore.Q_ARG(str, 'arg1'))
@QtCore.pyqtSlot(object)
def handleResult(self, result):
... # do stuff with result
class Worker(QtCore.QObject):
resultReady = QtCore.pyqtSignal(object)
@QtCore.pyqtSlot(str)
def someFunction(self, arg):
...
self.resultReady.emit({'func': 'someFunction', 'result': True})