我希望能够在一个单独的进程中实例化多个QWidget()类型类。就像Google Chrome在您打开新标签页时所做的那样。
这在python中可行吗?
答案 0 :(得分:3)
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})