6

これは説明を求めるものなので、質問というよりはあります。Mark Summerfield の「Python と Qt を使用した高速 GUI プログラミング」をフォローしていますが、私が使用していてさまざまなタイプでいっぱいの実際の「instance_item」をリンクする次のメカニズムが理解できないため、何かを見落としているに違いありません。データの、および利便性のために QTreeWidget モデルでそれを表す「widget_item」。

設定:

widget_item.setData(0, Qt.UserRole, QVariant(long(id(instance_item))))

取得

widget_item.data(0, Qt.UserRole).toLongLong()[0]

toLongLong()まったく「Pythonic」とは思えないのに、なぜ Qt.UserRole と QVariant を呼び出すのでしょうか? 「setData」および「data」関数は Qt フレームワークの一部ですか、それともより一般的な Python コマンドですか?

4

2 に答える 2

10

少なくとも 2 つのより良い解決策があります。Pythonicity の高い順に並べると、次のようになります。

1)データ型のパッキングはそれほど必要ありません

widget_item.setData(0, Qt.UserRole, QVariant(instance_item))
widget_item.data(0, Qt.UserRole).toPyObject()

2) QVariant が廃止された PyQt4 への代替 API があり、QVariant との間の変換が透過的に行われます。有効にするには、 PyQt4 import ステートメントのに次の行を追加する必要があります。

import sip
sip.setapi('QVariant', 2)

次に、コードは次のようになります。

widget_item.setData(0, Qt.UserRole, instance_item)
widget_item.data(0, Qt.UserRole)  # original python object

sip.setapi('QString', 2)QString を廃止するオプションもあり、代わりに unicode を使用できることに注意してください。

于 2012-07-20T03:03:35.230 に答える
5

これらすべてのメソッド -- setData()、data()、toLongLong() はすべて Qt の一部であり、元々は C++ で使用することを意図していました。著者がここで何をしようとしているのかはよくわかりませんが、ひどく非 Pythonic なことをしていることに気付いた場合は、おそらくもっと良い方法があります。

## The setter:
widget_item.instance_item = instance_item

## The getter:
instance_item = widget_item.instance_item

もちろん、C++ には動的な属性の割り当てがないため、Qt のドキュメントではこれを推奨できません。QVariant やその他のナンセンスを処理しなければならない非常に特殊な例がいくつかあります (たとえば、QtSQL を介してデータベースを処理する場合) が、非常にまれです。

于 2012-07-14T16:21:55.703 に答える