<div dir="ltr"><div>Thanks Phil,</div><div><br></div><div>I recompiled PyQt5.13 against Qt5.12 mingw32. I had to modify the qmake generated .pro to add "QMAKE_CXXFLAGE += "-D_hypot=hypot", and add "-lpython" to "LIBS" to every sub project, but it finally compiled. Now I'm trying to run an exemple as you said, but it crashes without explainations. Here is the code sample:</div><div><br></div><div>#include <sip.h></div><div>#include <Python.h></div><div>#include <QDateTime><br></div><div><br></div><div>...<br></div><div><br></div><div>Py_Initialize();</div><div>PyImport_ImportModule("sip");</div><div>auto sipAPI_QtCore = reinterpret_cast<const sipAPIDef*>(PyCapsule_Import("PyQt5.sip._C_API", 0));<br>
PyImport_ImportModule("PyQt5.QtCore");</div><div>auto type = sipAPI_QtCore->api_find_type("QDateTime");<br></div><div><br></div><div>Could someone confirm me this example should work, please?</div><div>Thanks</div><div><br></div><div>Alexis<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le jeu. 29 août 2019 à 18:48, Phil Thompson <<a href="mailto:phil@riverbankcomputing.com">phil@riverbankcomputing.com</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 29/08/2019 17:21, Alexis Barbot wrote:<br>
> I looked at it, but it seems I didn't catch the point (or possibly the<br>
> moment I read it I did not figure out it could be what I needed...). I <br>
> now<br>
> understand that it explains I should get the c api dynamically to call <br>
> it,<br>
> whereas I was trying to call static method. I could get something <br>
> roughtly<br>
> working this way, with pyqt compiled in static (see code below). I'm<br>
> currently trying to clean everythind, but I realized I had to upgrade <br>
> Qt<br>
> for that, as I can't find a PyQt package for Qt5.9 (sad, as it's a <br>
> LTS). So<br>
> I'll keep you updated on my progress.<br>
<br>
See...<br>
<br>
<a href="https://www.riverbankcomputing.com/static/Docs/PyQt5/installation.html#understanding-the-correct-version-to-install" rel="noreferrer" target="_blank">https://www.riverbankcomputing.com/static/Docs/PyQt5/installation.html#understanding-the-correct-version-to-install</a><br>
<br>
> In my tests I realized something: is there some special care to do with<br>
> containers while passing from C++/python? In my first attemp to pass a<br>
> QVariantMap the items added after SetItem to python are not visible <br>
> from<br>
> python? (and items modified in python are not modified in c++). Any <br>
> special<br>
> thoughts about this?<br>
<br>
Impossible to say without example code.<br>
<br>
> Thanks for all your help<br>
> <br>
> Alexis<br>
> <br>
> ```<br>
> Py_Initialize();<br>
> PyEval_InitThreads();<br>
<br>
The following code...<br>
<br>
> auto sipModule = PyImport_ImportModule("sip");<br>
> PyImport_ImportModule("PyQt5.sip");<br>
> auto sipAPI = (const sipAPIDef*)PyCapsule_Import("sip._C_API", 0);<br>
> PyCapsule_Import("PyQt5.QtCore._C_API", 0);<br>
> auto sipModuleDict = PyModule_GetDict(sipModule);<br>
> auto sip_sipmod = PyImport_ImportModule("PyQt5.sip");<br>
> auto sip_capiobj = PyDict_GetItemString(PyModule_GetDict(sip_sipmod),<br>
> "_C_API");<br>
> <br>
> sipAPI_QtCore = reinterpret_cast<const<br>
> sipAPIDef*>(PyCapsule_GetPointer(sip_capiobj, "PyQt5.sip._C_API"));<br>
> qpycore_init();<br>
> sipExportModule(&sipModuleAPI_QtCore, SIP_API_MAJOR_NR, <br>
> SIP_API,MINOR_NR,<br>
> 0);<br>
<br>
...only needs to be...<br>
<br>
sipAPI_QtCore = reinterpret_cast<const <br>
sipAPIDef*>(PyCapsule_Import("PyQt5.sip._C_API", 0));<br>
PyImport_ImportModule("PyQt5.QtCore")<br>
<br>
...but I haven't actually tested it.<br>
<br>
> auto m = PyImport_AddModule("__main__");<br>
> auto g = PyModule_GetDict(m);<br>
> auto d = PyDictNew();<br>
> <br>
> auto test = std::make_unique<QDateTIme>(QDateTIme::currentDateTime);<br>
> auto type = sipAPI_QtCore->api_find_type("QDateTime);<br>
> auto pyTest = sipAPI_QtCore->api_convert_from_type(test.get(), type,<br>
> nullptr);<br>
> // Ici je visualise l'objet C++ en python<br>
> PyDict_SetItem(d, PyUnicode_FromString("testdate"), Py_file_input, g, <br>
> d);<br>
> PyRun_String("print(testdate.toString())", Py_file_input, g, d);<br>
> test->setDate(QDate{2000,02,03});<br>
> // Ici je visualise en python que l'objet a été modifié en c++<br>
> PyDict_SetItem(d, PyUnicode_FromString("testdate"), Py_file_input, g, <br>
> d);<br>
> Py_FinalizeEx();<br>
> ```<br>
<br>
Make sure you aren't #including sipAPIQtCore.h. Those files are internal <br>
and contain nothing public.<br>
<br>
Phil<br>
<br>
</blockquote></div>