【问题标题】:PySide: Returning a value from a slotPySide:从插槽返回一个值
【发布时间】:2013-05-15 01:15:17
【问题描述】:

Pyside documentation 声明槽可以有返回值,但我还没有弄清楚它是如何做到的。

我找不到任何可用的代码示例,所以我按照文档的建议添加了一个装饰器:

def testSlot(self):
    print('testSlot called')
    return 'RETURN VALUE RETURN VALUE RETURN VALUE'

我正在尝试像这样捕获返回值:

ret = foo.testSignal.emit()

但它不起作用。我的测试代码,你可以找到here,也可以找到crashesthis 错误输出。感谢您的帮助!

编辑:我已经删除了装饰器,这解决了崩溃问题,但它仍然没有返回我希望它返回的值。

按原样运行脚本给我这个:

foo.testSignal.emit()
调用 testSlot
真的

【问题讨论】:

  • 装饰器中有两个@s
  • 哎呀,不知道它是怎么进来的。我修复了它,但它仍然崩溃。
  • 它是如何崩溃的?什么是完整的回溯?
  • 它给了我一个"python.exe has stopped working" message box。问题详情的全文是here。控制台上没有输出。另外,pastie 似乎是添加了额外的@ 的那个,由于某种原因,它在每次重新粘贴后都会再次添加它。
  • 我遇到了类似的问题。一些有时对我有用的尝试:@Slot() 没有参数。如果失败,请完全移除装饰器。

标签: python pyside signals-slots


【解决方案1】:

恐怕你认为不可能。 信号和槽松散耦合在一起,因此发出信号不会直接调用槽,因此无法检索“其”返回值

如果您考虑一下,这可能会更清楚:

您可以将 2 个不同的插槽(例如 2 个不同的类)连接到一个信号,它们返回不同的值。这两个返回值中的哪一个应该到达您尝试分配的变量?

您的意思可能是this:这是完全不同的东西,它允许通过“名称”在 MetaObject 系统上“调用”方法来返回值。

【讨论】:

  • 抱歉回复延迟,我不在国内,上网受限。您能否详细说明“通过“名称”在 MetaObject 系统上“调用”该方法?我将如何使用它来捕获返回值?
  • 您可以使用QMetaObject::invokeMethod 在 C++ 中通过 MetaObject 系统的名称(如 QString)“调用”或“调用”Qt 中的方法 - 所以这是动态的,而不是预编译的。从例如调用 C++ 方法需要它。 QML - QML 只能调用 MetaObject 系统已知的方法。因此,需要 Q_INVOCABLE 来使函数为人所知 - 如果你想要一个返回值,例如PySide 进入 QML,你没有 Q_INVOCABLE - 你只需要声明一个 Slot,然后 MetaObject 系统会自动知道它。
  • 这是正确的答案。一个小问题是,默认情况下,发出信号是直接(同步)而不是排队(异步),因此您可能会将其视为“直接调用”,因为在信号处理程序中继续执行,但如所述,可能在几个信号处理程序,按照它们连接的顺序。另外,为什么这样的错误代码会崩溃?存在哪些工具来警告您正在连接到错误返回值的处理程序?
  • 嗯。不是真的。每个默认的信号槽连接是ÀutonConnections:在同一个线程中,它们是直接调用(更快),但在不同的线程中,它们是QueuedConnections - 称为异步。因此,除非您将 DirectConnection 传递给不同线程的信号槽对,否则您是安全的。见srinikom.github.io/pyside-docs/PySide/QtCore/Qt.htmlqt-project.org/doc/qt-4.8/…
【解决方案2】:

也许你可以“注入”任何你想从 testSlot 函数返回的东西到发出信号的类的属性中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-21
    • 2015-01-12
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多