2009-08-04 6 views
5

かなり簡単な質問です。古いスタイルのクラスのプロパティを使うべきではないはずですが、Qtクラス(PyQt4を通して)は新しいスタイルではなく、コードの中のいくつかのプロパティがあります。古いスタイルのPythonクラスでプロパティを使用すると問題が発生する

私はpyqtProperty関数を実行しましたが、私はそれに関するドキュメントを見つけることができませんでした。この場合、良い選択肢になるでしょうか?

答えて

4

プロパティはQObjectが処理するメタクラスを持っているために機能します。 ... @クォークのコード上のこの小さな変化を目撃:

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の場合、別のメタクラスがあります。これはタイプのサブクラスです(クラスが「新しいスタイルではない」と言うのは本当に正しいわけではありません!)。

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 

pyqtPropertyはPythonのと同じではないQt's property systemを使用できるようにすることです。 Qtのプロパティは、QtのC++クラス(純粋なPythonプロパティではない)からイントロスペクトされ、Qt Designerフォームエディタ、Qt Creator IDEなどのためにQtによって使用されます。彼らは実行時間という多くの種類のイントロスペクションをPythonで持ち、C++でミスしたことを認めています。一般的に、QtはC++に動的言語の機能のいくつかを提供していますが、これはPyQtが提供する唯一の方法ではありません(文字列、辞書、ファイルI/Oなども考慮してください)。これらの選択の大部分で私が持っている主なアドバイスは、ちょうどいくつかの不愉快な非互換性の可能性を避けるために、一方または他方を選んでそれに固執することです。私はQtバージョンよりPythonバージョンを好む傾向があります。なぜなら、PythonはQtよりも私の仕事の中核であるからです。 PyQtのものからC++のQtに移植することを検討するつもりなら、あなたはPythonのものよりもQtバージョンの機能を好むかもしれません。

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'>) 
+0

奇妙な、多分私達はコードをチェックするために使用しているツールは、それが間違って理解しています... –

+0

PyQtの文書によると、「PyQtのバージョンでは、PyQtクラスでスーパーの使用に制限がありましたが、これらの制限はv4.5以降では適用されなくなりました。 4.5より前のバージョンを使用している場合は、おそらく問題でしょうか?そうでなければ、私は迷っています! (出典:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#super-and-pyqt-classes) –

+0

私は同じテストを私の上で実行し、それは私に同じことを教えてくれます私は先に進んで、使用しているツールがちょうど混乱していると仮定します。ありがとう –

関連する問題