为什么PyQt中的信号和插槽?

Wil*_*bur 2 python qt pyqt signals-slots qt-signals

我正在学习PyQt(之前我没有使用过C++ Qt).

我不明白信号和插槽的原因.也就是说,我似乎可以通过直接调用类的方法来完成所有操作.这样做似乎更Pythonic,使用更少的代码,更容易阅读.我错过了什么?

为了澄清,我问为什么我会这样做:

def mouseReleaseEvent(self):  
    self.clicksignal.connect(ui.iconClicked) 
    self.clicksignal.emit()
Run Code Online (Sandbox Code Playgroud)

当我能做到这一点:

def mouseReleaseEvent(self): 
    ui.iconClicked()
Run Code Online (Sandbox Code Playgroud)

Vik*_*kez 7

信号和插槽存在的原因是因为除了UI线程之外,您无法从应用程序的任何其他线程更改GUI.

如果你要做一些繁重的CPU密集型计算,或者等待IO或类似的任何任务...如果你这样做UI线程(例如,如果你获取一个url或持续一段时间的东西),你的UI线程将忙,GUI事件循环将无法自行更新,因此GUI似乎已冻结.

做这些操作.您在一个单独的(后台工作程序)线程中执行它们,因此UI线程可以继续更新GUI.

现在的问题是,您无法访问GUI的元素并从除UI线程之外的任何其他线程更改其状态.因此引入了信号和插槽.当您发出信号时,它确保被捕获在UI线程中,并且插槽将在UI线程中执行.

我不确定你在你的例子中想要完成什么,但这是信号和插槽存在的主要原因.基本上UI线程应该只处理UI,其他一切都应该在后台工作线程中完成,该线程发送一个在UI线程中捕获的信号,并且更新GUI的槽在UI线程中执行.