[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