【问题标题】:Refer to a signal whose name is passed as string (new-style signals/slots)?引用名称作为字符串传递的信号(新型信号/插槽)?
【发布时间】:2014-09-28 14:04:12
【问题描述】:

我正在重构一些使用旧式信号和槽的代码,它所做的一件事是将内置信号作为字符串(例如,signalName="clicked()")传递给另一个实际连接信号和插槽。例如:

self.connect(widget, QtCore.SIGNAL(signalName), slot)

这很好用。问题是,转换为新型信号和槽(其中信号不作为参数传递)会使这变得更加复杂。在新式的信号和槽中,上面会是 something 像:

widget.[signalName].connect(slot)

[signalName] 是可行的。 :) 如果不使用eval,我有很多事情不能工作:

widget.signalName.connect(slot) #AttributeError: widget object has no attribute 'signalName'

基于a related post:

signalDict={}
signalDict["clicked"]=QtGui.QAbstractButton.clicked
widget.signalDict["clicked"].connect(slot) #AttributeError: widget object has no attribute 'signalDict'

当然有eval,它确实有效:

fullCommand="widget." + signalName + ".connect(slot)"
eval(fullCommand)

但它使用eval,这有点令人不悦。不使用eval,是否有更好的方法将此类代码转换为新型信号和插槽?

请注意,我试图将其转换为新型信号和插槽的原始代码在这里: https://github.com/ghosert/VimProject/blob/master/pyqt/book_samples/chap06/imagechanger.pyw

来自 Summerfield 的 Qt 编程书的第 6 章。

相关问题:

Passing Arguments with Newstyle signals in PyQT

【问题讨论】:

  • 使用signalDict["clicked"] = QtGui.QAbstractButton.clicked 而不是signalDict["clicked"]=QtGui.QAbstractButton.clicked()

标签: python qt pyqt pyside signals-slots


【解决方案1】:

这个怎么样?

getattr(widget, signalName).connect(slot)

您可能需要事先添加if hasattr(...) 检查以确保信号确实存在。

【讨论】:

  • 有效!!!这也帮助我意识到这些点不仅仅是为了展示:新型连接是真正的实例属性:)
  • @neuronet 酷!此外,新式信号实际上是 class 属性,而不是实例属性。如果您尝试将其定义为实例属性 (self.my_signal = ...),则会出现异常。我知道,因为我以前试过。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 2012-09-11
相关资源
最近更新 更多