5

かなり単純な質問です。多くの場所で、古いスタイルのクラスでプロパティを使用するとうまくいかないことが言及されているのを見てきましたが、明らかに Qt クラス (PyQt4 を介して) は新しいスタイルではなく、コード内のいくつかのプロパティにプロパティがあります。で作業しています(そして、私が知る限り、コードは何の問題も示していません)

pyqtProperty 関数に出くわしましたが、それに関するドキュメントが見つからないようです。この場合、それは良い代替案でしょうか?

4

3 に答える 3

4

QObjectにはそれらを処理するメタクラスがあるため、プロパティは機能します。@quark のコードのこの小さなバリエーションを目撃してください...:

from PyQt4.QtCore import QObject

def makec(base):
  class X( base ):
      def __init__(self):
          self.__x = 10
      def get_x(self):
          print 'getting',
          return self.__x
      def set_x(self, x):
          print 'setting', x
          self.__x = x
      x = property(get_x, set_x)

  print 'made class of mcl', type(X), issubclass(type(X), type)
  return X

class old: pass
for base in (QObject, old):
  X = makec(base)
  x = X()
  print x.x # Should be 10
  x.x = 30
  print x.x # Should be 30

これを実行すると、次のように出力されます。

made class of mcl <type 'PyQt4.QtCore.pyqtWrapperType'> True
getting 10
setting 30
getting 30
made class of mcl <type 'classobj'> False
getting 10
30

違いを見ます?本当にレガシー (古い型) クラスであるクラスでは、2 回目に作成されたメタクラスはclassobj(これは型のサブクラスではありません) であり、プロパティは正しく機能しません (割り当てx.xはプロパティをバイパスし、その後取得しますx.xプロパティも表示されなくなります)。しかし、最初のケースである Qt のケースでは、別のメタクラスがあり、それは type のサブクラスであり (したがって、クラスが「新しいスタイルではない」と言うのは正しくありません!)、したがって物事は正しく機能します。

于 2009-08-05T02:04:04.800 に答える
3

私の経験では、Python ソートのプロパティは PyQt4 オブジェクトで問題なく機能します。それらが PyQt4 によって明示的にサポートされているかどうか、またはいくつかの隠れた落とし穴があるかどうかはわかりませんが、それらが誤動作するのを見たことはありません。PyQt 4.4 と Python 2.5 を使用した例を次に示します。

from PyQt4.QtCore import QObject

class X( QObject ):

    def __init__(self):
        self.__x = 10

    def get_x(self):
        return self.__x

    def set_x(self, x):
        self.__x = x

    x = property(get_x, set_x)

x = X()
print x.x # Should be 10
x.x = 30
print x.x # Should be 30

pyqtPropertyPython とは異なるQt のプロパティ システムを使用できるようにすることです。Qt のプロパティは、Qt の C++ クラス (生の Python プロパティはそうではありません) 内からイントロスペクト可能であり、Qt Designerフォーム エディターやQt Creator IDE などのために Qt によって使用されます。それらは、ランタイムの多くの種類のイントロスペクションを可能にしますあなたがPythonにあり、C++に欠けていると述べてください。一般に、Qt は動的言語の機能の一部を C++ に提供します。これは、PyQt が同じことを行う複数の方法を提供する唯一の領域ではありません (文字列、辞書、ファイル I/O なども考慮してください)。これらの選択肢のほとんどについて、不快な非互換性の可能性を回避するために、どちらか一方を選択してそれに固執することをお勧めします。Python は Qt よりも私の仕事の中核であるため、Qt バージョンよりも Python バージョンを好む傾向があります。PyQt から C++ Qt に何かを移植することを検討している場合は、Python の機能よりも Qt バージョンの機能を好むかもしれません。

于 2009-08-04T23:32:54.350 に答える
1

少なくとも PyQt4.5 では、メソッドの解決順序からわかるように、Qt クラスは確かに新しいスタイル オブジェクトです。

from PyQt4 import QtGui
print QtGui.QWidget.__mro__
(<class 'PyQt4.QtGui.QWidget'>, <class 'PyQt4.QtCore.QObject'>, <type 'sip.wrapper'>, <class 'PyQt4.QtGui.QPaintDevice'>, <type 'sip.simplewrapper'>, <type 'object'>)
于 2009-08-05T09:46:37.267 に答える