1

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

2 回答 2

1

您认为 PySide 不需要 QString 类是正确的,但误认为存在任何不一致。

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

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

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

于 2013-11-27T18:15:10.600 回答
0

简而言之:效率。

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

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

是QString的详细描述。请注意关于隐式共享的链接。

以下是 PySide 更惯用的其他可能性示例。

于 2013-09-17T05:56:37.830 回答