我之前的理解是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)
答案 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)