为什么PySide仍然需要QString用于textChanged SIGNAL?

时间:2013-09-10 16:51:15

标签: python pyside signals-slots qstring

我之前的理解是PySide不需要QString。然而我发现PySide(我使用v1.2.1和Python v2.7.5)似乎与此不一致,这取决于我如何连接我的信号和插槽:

# This Way of wiring up signals and slots requires str
le = QLineEdit()
slotOnChanged = self.onChanged
le.textChanged[str].connect(slotOnChanged)

# But this Way requires QString
le = QLineEdit()
signalTextChanged = SIGNAL("textChanged(QString)")
slotOnChanged = self.onChanged
le.connect(signalTextChanged, slotOnChanged)

2 个答案:

答案 0 :(得分:1)

你是正确的,PySide不需要QString类,但错误的是有任何不一致。

PySide / PyQt通常是围绕Qt的C ++库的非常薄的包装器。然而,信号和时隙语法是与此存在显着偏差的少数几个区域之一。 Qt(示例中的第二个方法)使用的语法需要详细了解C ++签名参数,并且很容易出错。此外,从python的角度来看,语法是不必要的冗长,而是“unpythonic”。正因为如此,PySide / PyQt增加了一些语法“糖”,为信号和插槽提供了另一种更加pythonic的语法。这将在您的示例中使用第一种方法。

QString必须在第二种方法中使用的具体原因是,Qt信号是作为C ++类的一部分定义的静态。所以SIGNAL的参数必须非常精确地匹配C ++定义才能使连接成功。但请注意,SIGNAL的参数不需要QString 可用 - 它只需要在签名中使用字符串“QString”。

连接信号的“旧的”,C ++方式可能会在相当长的一段时间内保持可用(如果没有别的话,可用于向后兼容)。但是,尽可能使用“新的”pythonic方式通常会更好。它更清晰,更具可读性。

答案 1 :(得分:0)

简而言之:效率。

QString由QChar组成。这些提供了C ++和Python绑定之间的跨平台兼容性(以及更容易的语言翻译); Python中的字符串与C ++中的字符串通常是不同的。 Qt提供了自己的。

textChanged(QString)使用QString因为...... 1)它可以在语言绑定之间提供更加不可知的类型, 2)它避免了第一个例子中发生的类型转换,效率更高。

Here是QString的详细说明。请注意隐式共享上的链接。

Here是PySide更为惯用的其他可能性的例子。