PyQt类多进程

时间:2016-03-16 08:42:08

标签: python python-2.7 pyqt pyqt4 python-multiprocessing

我希望能够在一个单独的进程中实例化多个QWidget()类型类。就像Google Chrome在您打开新标签页时所做的那样。

这在python中可行吗?

1 个答案:

答案 0 :(得分:3)

GUI元素(包括QWidget)只能在主线程中创建。

但是,您可以将每个选项卡的模型和业务逻辑放在一个单独的线程中,并使用SignalsSlots分别与主线程进行通信。 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})