1

私の以前の理解では、PySide は QString を必要としないというものでした。それでも、PySide (Python v2.7.5 で v1.2.1 を使用しています) は、シグナルとスロットをどのように接続するかによって、これについて一貫性がないように見えることがわかりました。

# 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++ ライブラリの非常に薄いラッパーです。ただし、シグナルとスロットの構文は、これと大きく異なる数少ない領域の 1 つです。Qt で使用される構文 (例の 2 番目の方法) には、C++ 署名引数の詳細な知識が必要であり、間違いやすいです。また、Python の観点から見ると、構文は不必要に冗長であり、むしろ「非 Pythonic」です。このため、PySide/PyQt は、シグナルとスロットに代替の、より Pythonic な構文を提供するいくつかの構文 "sugar" を追加しました。これは、例の最初のメソッドで使用されます。

2 番目の方法で QString を使用する必要がある具体的な理由は、Qt シグナルがC++ クラスの一部として静的に定義されているためです。したがって、SIGNAL への引数は、接続が成功するために C++ の定義と正確に一致する必要があります。ただし、SIGNAL への引数では、QStringクラスが使用可能である必要はありません。署名で文字列 "QString" を使用する必要があるだけです。

信号を接続する「古い」C++ の方法は、おそらくかなりの期間利用可能なままになります (他に何もなくても下位互換性のため)。ただし、一般的には、可能な限り「新しい」Pythonic の方法を使用することをお勧めします。はるかに明確で、読みやすくなっています。

于 2013-11-27T18:15:10.600 に答える
0

要するに、効率。

QString は QChar で構成されます。これらは、C++ バインディングと Python バインディングの間のクロス プラットフォーム互換性を提供します (言語の翻訳を容易にするためだけでなく)。通常、Python の文字列と C++ の文字列は異なります。Qt は独自のものを提供します。

textChanged(QString) が QString を使用する理由は ... 1) 言語バインディング間でより不可知な型を提供できるため、2) 最初の例で発生する型変換を回避し、より効率的です。

QString の詳細な説明は次のとおりです暗黙の共有に関するリンクに注意してください。

PySide のより慣用的な他の可能性の例を次に示します

于 2013-09-17T05:56:37.830 に答える