[PyQt] What happend to PyQt5.QtCore.pyqtWrapperType?

Marcus Ottosson konstruktion at gmail.com
Thu Feb 9 14:31:56 GMT 2017


I didn’t see how it applied to this situation, but now I see.

Changed from this..

class PropertyType(QtCore.pyqtWrapperType):

To this..

class PropertyType(type(QtCore.QObject)):

And it worked.

Thanks Phil!
​

On 9 February 2017 at 14:17, Phil Thompson <phil at riverbankcomputing.com>
wrote:

> 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
>
>


-- 
*Marcus Ottosson*
konstruktion at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20170209/01c6fefa/attachment.html>


More information about the PyQt mailing list