[PyQt] How to write handwritten code to access the C++ object when the corresponding python object destroyed?

Weitian Leung weitianleung at gmail.com
Thu Feb 20 02:20:23 GMT 2020


But nothing changes as I added the __dtor__

// typedef unsigned short BSTR;
> %MappedType BSTR /TypeHint="str",TypeHintValue="''"/
> {
> %ConvertToTypeCode
> ...
> %End
>
> %ConvertFromTypeCode
> ...
> %End
> };
> void __dtor__();
> %MethodCode
>     printf(">>>>>> __dtor__\n");
> %End
>

If place the __dtor__ inside the MappedType block, got syntax error when
build...
Repace __dtor__ with __del__ is the same. Seems that __dtor__ is for
struct/class only?

I can't find more information from the SIP docs.

On Thu, Feb 20, 2020 at 12:24 AM Phil Thompson <phil at riverbankcomputing.com>
wrote:

> Have a look at %MethodCode for dtors.
>
> Phil
>
> On 19/02/2020 14:19, Weitian Leung wrote:
> > One more question, is it possible to insert handwritten code to the
> > MappeedType's release_XXX?
> >
> > When mapped one type to python's str, which type has it's own alloc
> > method
> > (The BSTR for example, SysStringAlloc etc). After passed to the C++
> > call
> > and returned, we need to free the memory using it's own dealloc method.
> >
> > So is it possible do that? Or other way to call the dealloc method...
> >
> > On Wednesday, February 19, 2020, Weitian Leung <weitianleung at gmail.com>
> > wrote:
> >> Thanks, it works!
> >>
> >> On Wednesday, February 19, 2020, Phil Thompson <
> > phil at riverbankcomputing.com> wrote:
> >>> On 17/02/2020 14:35, Weitian Leung wrote:
> >>>>
> >>>> Hi,
> >>>>     I'm noob in SIP. Say I have two abstract interfaces and one
> >>>> method
> > to
> >>>> create the object:
> >>>>
> >>>> struct IUnknown /Abstract/
> >>>>>
> >>>>> {
> >>>>>     virtual void AddRef() = 0;
> >>>>>     virtual void Release() = 0;
> >>>>>
> >>>>>     %GCClearCode
> >>>>>         printf("GCClearCode\n");
> >>>>>     %End
> >>>>> };
> >>>>>
> >>>>> struct IDemo : public IUnknown /Abstract/
> >>>>> {
> >>>>>     virtual void SayHi() = 0;
> >>>>> };
> >>>>>
> >>>>
> >>>> void createDemo(IDemo **demo /Out/);
> >>>>>
> >>>>
> >>>>
> >>>> Using in python side:
> >>>> idemo = demo.createDemo()
> >>>> idemo = None
> >>>>
> >>>> Is it possible to write some handwritten code that call the Release
> > method
> >>>> when idemo set to None or when  idemo doing GC?
> >>>> Or if we can call AddRef automatically when idemo assign to another
> > object.
> >>>>
> >>>> I known that on python side we can call AddRef/Release to make it
> >>>> works,
> >>>> but I want the code more python's way.
> >>>>
> >>>> The %GCClearCode handwritten code never called in this case.
> >>>> And the %GCTraverseCode handwritten code only call when the object
> >>>> make
> > an
> >>>> assignment to other object.
> >>>> Am I missing something?
> >>>>
> >>>> Please check the full code in the  attached file.
> >>>
> >>>
> >
> https://www.riverbankcomputing.com/static/Docs/sip/c_api.html#event-handlers
> >>>
> >>> I've only just realised that that documentation is incomplete. The
> >>> two
> > event types currently implemented are...
> >>>
> >>> sipEventWrappedInstance,    /* After wrapping a C/C++ instance. */
> >>> sipEventCollectingWrapper,  /* When garbage collecting a wrapper
> >>> object.
> > */
> >>>
> >>> ...and the corresponding event handler signatures are...
> >>>
> >>> typedef void (*sipWrappedInstanceEventHandler)(void *sipCpp);
> >>> typedef void (*sipCollectingWrapperEventHandler)(sipSimpleWrapper
> > *sipSelf);
> >>>
> >>> Phil
> >>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20200220/4e787b01/attachment-0001.html>


More information about the PyQt mailing list