Frage

Pretty einfache Frage. Ich habe es an vielen Stellen erwähnt gesehen, die Eigenschaften auf einer alten Stil-Klasse nicht funktionieren soll, aber anscheinend Qt-Klassen (durch PyQt4) ist nicht neu Stil und es gibt Eigenschaften auf ein paar von ihnen in dem Code, den ich ist die Arbeit mit (und soweit ich dem Code kennen ist keine Art von Problemen angezeigt)

Ich habe über eine pyqtProperty Funktion ausführen, aber ich kann keine Dokumentation darüber zu finden scheinen. Wäre es eine gute Alternative in diesem Fall sein?

War es hilfreich?

Lösung

Eigenschaft funktioniert, weil QObject eine Metaklasse hat, die um sie kümmert. Zeuge dieses kleine Variation @ Quark Code ...:

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

läuft diese aussendet:

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

sehen Sie den Unterschied? In der Klasse, die wirklich ein Vermächtnis (alter Typ) Klasse ist, die man zum zweiten Mal gemacht, ist metaclass classobj (die nicht eine Unterklasse vom Typ IS) und Eigenschaften funktionieren nicht richtig (Zuordnung x.x umgeht die Eigenschaft, und nach dass immer x.x schaut nicht die Eigenschaft nicht mehr entweder). Aber im ersten Fall der Qt Fall ist es eine andere metaclass, und es ist eine Unterklasse vom Typ (so ist es nicht wirklich richtig, die Klasse zu sagen „ist nicht neu Stil“!), Und die Dinge daher richtig funktionieren.

Andere Tipps

Die Eigenschaften der Python Art der Arbeit, in meiner Erfahrung ganz gut auf PyQt4 Objekten. Ich weiß nicht, ob sie von PyQt4 explizit unterstützt werden oder nicht oder ob es einige versteckten gotchas, aber ich habe sie nie schlecht benehmen gesehen. Hier ist ein Beispiel unter Verwendung von PyQt 4.4 und 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 ist, damit mit Qt-Eigenschaftensystem die nicht das gleiche ist wie Python. Qt Eigenschaften sind introspectable aus Qt C ++ Klassen (die rohe Python Eigenschaften sind nicht), und werden von Qt für solche Dinge wie die Qt Designer Formulareditor und Qt Creator IDE. Sie ermöglichen eine Menge von der Art der Selbstbeobachtung von Laufzeit Zustand, die Sie in Python haben und verpassen in C ++. Im Allgemeinen bietet Qt einige der Funktionen von dynamischen Sprachen C ++, und dies ist nicht der einzige Bereich, in dem PyQt mehr als einen Weg bietet die gleiche Sache zu tun (man denke auch Strings, Wörterbücher, Datei-I / O und so weiter). Bei den meisten dieser Entscheidungen die wichtigsten Ratschläge, die ich habe ist nur eine oder die andere Seite zu holen und halten mit ihm, sondern nur die Möglichkeit, einige unangenehme Unverträglichkeit zu vermeiden. Ich neige dazu, die Python-Version über die Qt-Version zu bevorzugen, weil Python mehr Kern meiner Arbeit ist als Qt ist. Wenn Sie wollten nichts von PyQt zurück zu C ++ Qt betrachten Portierung, als Sie die Qt-Version eines Features über den Python vorziehen könnten.

Mindestens in PyQt4.5, Qt-Klassen sind sicherlich neuer Stil Objekte, wie aus ihrer Methode Auflösung, um zu sehen:

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'>)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top