문제

아주 간단한 질문. 많은 장소에서 구식 클래스에서 속성을 사용하는 것이 작동하지 않아야하지만 분명히 QT 클래스 (PYQT4를 통해)는 새로운 스타일이 아니며 코드 I에 몇 가지 속성이 있습니다. 'M과 함께 일하고 있습니다 (그리고 코드가 어떤 종류의 문제도 보여주지 않는 한)

나는 pyqtproperty 함수를 가로 질러 실행했지만 그것에 대한 문서를 찾을 수없는 것 같습니다. 이 경우 좋은 대안일까요?

도움이 되었습니까?

해결책

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

차이를 보시겠습니까? 수업에서 실제로 유산 인 (오래된 유형) 수업은 두 번째로 Metaclass가 classobj (유형의 서브 클래스가 아닌) 및 속성은 제대로 작동하지 않습니다 (할당 x.x 재산을 우회하고 그 후에 x.x 재산이 더 이상 보이지 않습니다). 그러나 첫 번째 경우, QT 사례에는 다른 메타 클래스가 있으며, 유형의 서브 클래스입니다 (따라서 클래스가 "새로운 스타일이 아니라고 말하는 것은 정확하지 않습니다!). 따라서 일이 정확하게 작동합니다.

다른 팁

파이썬 정렬 작업의 속성은 내 경험에 따라 PYQT4 객체에서 괜찮습니다. PYQT4에 의해 명시 적으로 지원되는지 또는 숨겨진 gotchas가 있는지 여부는 모르겠지만, 나는 그것들이 잘못 행동 한 적이 없습니다. 다음은 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 사용을 허용하는 것입니다 QT의 속성 시스템 Python 's와 다릅니다. QT 특성은 QT의 C ++ 클래스 (원시 파이썬 특성이 아닌) 내에서 내성적이며, QT는 그와 같은 것들에 대해 사용합니다. QT 디자이너 양식 편집자 및 QT 제작자 IDE. 그들은 많은 종류의 내성을 허용합니다. 실행 시간 Python에 있고 C ++로 놓친 것을 말하십시오. 일반적으로 QT는 동적 언어의 일부 기능을 C ++에 제공하며 PYQT가 동일한 작업을 수행 할 수있는 여러 가지 방법을 제공하는 유일한 영역이 아닙니다 (문자열, 사전, 파일 I/O 등을 고려하십시오). 이러한 선택의 대부분을 통해 내가 가진 주요 조언은 한쪽 또는 다른 쪽을 골라서 불쾌한 비 호환성의 가능성을 피하기 위해 단지 그것을 고수하는 것입니다. Python은 QT보다 내 작업의 핵심이기 때문에 QT 버전보다 Python 버전을 선호하는 경향이 있습니다. PYQT에서 C ++ QT로의 포트를 고려하려는 경우 Python One보다 기능의 QT 버전을 선호 할 수 있습니다.

적어도 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'>)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top