【问题标题】:What effect will exist when using any 'return' statement inside Qt's slot在 Qt 的 slot 中使用任何 'return' 语句会产生什么影响
【发布时间】:2019-02-27 03:40:31
【问题描述】:

例如,我将 QPushButton 的“点击”信号连接到名为“func_with_return”的函数。假设这个函数中只有三个语句:第一个是'print('start')',第二个是'return 1',最后一个是'print('end')'。有我基于PyQt5的python代码。

import sys
from PyQt5.QtWidgets import QApplication, QFrame, QPushButton

class MyWindow(QFrame):    
    def __init__(self):
        super(MyWindow, self).__init__()
        self.layout_init()
        self.layout_manage()

    def layout_init(self):
        self.setFixedSize(800, 600)
        self.button01 = QPushButton('click!', self)
        self.button01.setFixedSize(100, 100)
        self.button01.clicked.connect(self.func_with_return)

    def layout_manage(self):
        pass

    def func_with_return(self):
        print('---------func_with_return starts---------')
        return 1
        print('---------func_with_return ends---------')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mywindow = MyWindow()
    mywindow.show()
    sys.exit(app.exec_())

点击这个按钮后基本上没有错误。我很好奇的是“槽”内的“返回”引起的中断。这个中断会不会和signal&slot机制发生冲突?

【问题讨论】:

  • 我发现了一个类似的问题Qt: meaning of slot return value?。他们的讨论假设在插槽中使用“return”语句是可以的。而我的问题略有不同:这个假设是否正确?

标签: python pyqt pyqt5 qt-signals qt-slot


【解决方案1】:

没有。信号只调用函数,如果函数返回 Qt 将不会使用它。

另一方面,在 Qt/PyQt 中,如果您使用装饰器 @QtCore.pyqtSlot(),则表示函数是 。在您的情况下,这是一个简单的功能。即便如此,信号也不会为返回调用的槽或函数的数据提供服务。

这个中断会不会和signal&slot机制发生冲突?

不,它没有碰撞。回到开头、中间或结尾无关紧要,记住每个函数都会返回一些东西(如果你不使用 return,函数将在结尾隐式返回 None)。


另一方面,在 GUI 中,函数的任务必须很轻,如果它们很重,则必须在另一个线程中执行它。

【讨论】:

  • 感谢您的回答。我阅读了官方文章(doc.qt.io/qt-5/signalsandslots.html),仍然没有得到任何关于这个问题的线索。你能给我一些参考吗?
  • @C.Hobin 是不是真的没有关于它的参考,也许可以参考看看源代码。
  • @C.Hobin 也许doc.qt.io/qt-5/signalsandslots.html#signals: 当一个信号发出时,连接到它的槽通常会立即执行,就像一个普通的函数调用一样。所以在 Qt 源代码中应该有类似于:while(is_available_data) # other code if(is_signal_emitted(signal)) for slot in get_slots_by_signal(signal): slot()
  • 我明白你的意思。实际上,我并不期望从发出信号的地方获得任何价值。我很好奇的是“槽”内的“返回”引起的中断。这个中断会不会和signal&slot机制发生冲突?
  • @C.Hobin 不,它没有碰撞。返回开头、中间或结尾无关紧要,记住每个函数都会返回一些东西(如果不使用 return,函数将在结尾隐式返回 None)。另一方面,在 GUI 中,函数的任务必须很轻,如果它们很重,则必须在另一个线程中执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
相关资源
最近更新 更多