【发布时间】:2019-09-29 01:37:52
【问题描述】:
1。简介
我正在使用 Python 3.7 中的 PyQt5 处理多线程应用程序,为此我依赖 QThread。
现在假设我有一个派生自QObject 的类。在该类中,我定义了一个用 @pyqtSlot 注释的函数:
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import threading
...
class Worker(QObject):
def __init__(self):
super().__init__()
return
@pyqtSlot()
def some_function(self):
...
return
在其他一些代码中,我实例化 Worker() 并将其移至新线程,如下所示:
my_thread = QThread()
my_worker = Worker()
my_worker.moveToThread(my_thread)
my_thread.start()
QTimer.singleShot(100, my_worker.some_function)
return
通常,some_function() 现在应该在 my_thread 中运行。那是因为:
- 我已将
Worker()对象推送到my_thread。 - 当命令
my_thread启动时,我实际上在该线程中生成了一个新的Qt 事件循环。my_worker对象存在在这个事件循环中。它的所有插槽都可以接收一个事件,该事件在此事件循环中执行。 -
some_function()被正确注释为@pyqtSlot()。单次计时器挂钩到此插槽并触发一个事件。感谢my_thread中的Qt-event-loop,插槽有效地执行了my_thread中的代码。
2。我的问题
我的问题是关于嵌套函数(也称为“内部函数”)。考虑一下:
class Worker(QObject):
def __init__(self):
super().__init__()
return
def some_function(self):
...
@pyqtSlot()
def some_inner_function():
...
return
return
如您所见,some_inner_function() 被注释为@pyqtSlot。它的代码是否也会在Worker()-object 所在的线程中运行?
3。旁注:如何挂钩到内部函数
您可能想知道我如何将某些东西与内部函数挂钩。好吧,考虑以下几点:
class Worker(QObject):
def __init__(self):
super().__init__()
return
def some_function(self):
@pyqtSlot()
def some_inner_function():
# Will this code run in `my_thread`?
...
return
# some_function() will run in the main thread if
# it is called directly from the main thread.
QTimer.singleShot(100, some_inner_function)
return
如果您直接从主线程调用some_function(),它将(不幸地)在主线程中运行。如果没有正确使用信号槽机制,您将无法切换线程。
some_function() 内部的单发计时器钩住some_inner_function() 并触发。内部函数是否会在my_thread 中执行(假设Worker() 对象被分配给my_thread)?
【问题讨论】:
标签: python pyqt pyqt5 qthread qt-slot