[PyQt] What happend to PyQt5.QtCore.pyqtWrapperType?
Phil Thompson
phil at riverbankcomputing.com
Thu Feb 9 14:17:36 GMT 2017
On 9 Feb 2017, at 1:58 pm, Marcus Ottosson <konstruktion at gmail.com> wrote:
>
> Hi Phil,
>
> Do you have any recommendations for alternatives to pyqtWrapperType when it comes to metaclasses? I was using it to dynamically add signals to a QObject.
>
> class PropertyType(QtCore.pyqtWrapperType):
>
>
> """Metaclass for converting class attributes into pyqtProperties"""
>
>
> prefix =
> "__pyqtproperty__"
>
>
>
> def __new__(cls, name, bases, attrs):
>
>
> """Convert class properties into pyqtProperties"""
>
>
>
> for key, value in
> attrs.copy().items():
>
> if key.startswith("__"
> ):
>
> continue
>
>
> notify = QtCore.pyqtSignal()
>
>
> def set_data(key, value):
>
>
> def set_data(self, value):
>
> setattr(self, cls.prefix + key, value)
> getattr(self, key +
> "Changed"
> ).emit()
> self.__datachanged__.emit(self)
>
> return
> set_data
>
> attrs[key +
> "Changed"
> ] = notify
> attrs[key] = QtCore.pyqtProperty(
> type(value)
> if value is not None else
> QtCore.QVariant,
> fget=
> lambda self, k=key: getattr(self, cls.prefix + k, None
> ),
> fset=set_data(key, value),
> notify=notify)
>
>
> return
> super(PropertyType, cls).__new__(cls, name, bases, attrs)
>
>
> class AbstractItem(QtCore.QObject):
>
> __metaclass__ = PropertyType
> __datachanged__ = QtCore.pyqtSignal(QtCore.QObject)
>
>
> def __str__(self):
>
>
> return self.name
>
>
>
> def __repr__(self):
>
>
> return "%s.%s(%r)"
> % (__name__, type(self).__name__, self.__str__())
>
> Using type in place of pyqtWrapperType results in a:
>
> TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
>
> Production code here.
>
> Any ideas?
>
> Thanks.
Have you tried doing what I suggest below?
Phil
> On 18 January 2017 at 22:17, Phil Thompson <phil at riverbankcomputing.com> wrote:
> On 18 Jan 2017, at 6:51 pm, Cody Scott <cody at perspexis.com> wrote:
> >
> > I'm looking at this code for inspiration on testing QML and I ran into this error.
> >
> > https://github.com/pyblish/pyblish-qml/blob/635c82d75fa5d5e294339bf8265f05eb5ca3b5d3/pyblish_qml/models.py#L94
> >
> > AttributeError: module 'PyQt5.QtCore' has no attribute 'pyqtWrapperType'
> >
> > It doesn't appear to be available in PyQt5==5.7.1
> >
> > It is available in PyQt5==5.6
>
> It was an undocumented implementation detail that was removed as part of the adoption of the limited API.
>
> If code wants to get the meta-type used by PyQt then it should call type() on a PyQt type object.
>
> Phil
More information about the PyQt
mailing list