qtcore.cpp 84 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506
  1. // Copyright (C) 2018 The Qt Company Ltd.
  2. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
  3. /*********************************************************************
  4. * INJECT CODE
  5. ********************************************************************/
  6. // @snippet include-pyside
  7. #include <pysideinit.h>
  8. #include <limits>
  9. #include "glue/core_snippets_p.h"
  10. // @snippet include-pyside
  11. // @snippet core-snippets-p-h
  12. #include "glue/core_snippets_p.h"
  13. // @snippet core-snippets-p-h
  14. // @snippet qarg_helper
  15. // Helper for the Q_ARG/Q_RETURN_ARG functions, creating a meta type
  16. // and instance.
  17. struct QArgData
  18. {
  19. operator bool() const { return metaType.isValid() && data != nullptr; }
  20. QMetaType metaType;
  21. void *data = nullptr;
  22. };
  23. QArgData qArgDataFromPyType(PyObject *t)
  24. {
  25. QArgData result;
  26. const char *typeName{};
  27. if (PyType_Check(t)) {
  28. auto *pyType = reinterpret_cast<PyTypeObject *>(t);
  29. typeName = PepType_GetFullyQualifiedNameStr(pyType);
  30. result.metaType = PySide::qMetaTypeFromPyType(pyType);
  31. } else if (PyUnicode_Check(t)) {
  32. typeName = Shiboken::String::toCString(t);
  33. result.metaType = QMetaType::fromName(typeName);
  34. } else {
  35. PyErr_Format(PyExc_RuntimeError, "%s: Parameter should be a type or type string.",
  36. __FUNCTION__);
  37. return result;
  38. }
  39. if (!result.metaType.isValid()) {
  40. PyErr_Format(PyExc_RuntimeError, "%s: Unable to find a QMetaType for \"%s\".",
  41. __FUNCTION__, typeName);
  42. return result;
  43. }
  44. result.data = result.metaType.create();
  45. if (result.data == nullptr) {
  46. PyErr_Format(PyExc_RuntimeError, "%s: Unable to create an instance of \"%s\" (%s).",
  47. __FUNCTION__, typeName, result.metaType.name());
  48. return result;
  49. }
  50. return result;
  51. }
  52. // @snippet qarg_helper
  53. // @snippet settings-value-helpers
  54. // Convert a QVariant to a desired primitive type
  55. static PyObject *convertToPrimitiveType(const QVariant &out, int metaTypeId)
  56. {
  57. switch (metaTypeId) {
  58. case QMetaType::QByteArray:
  59. return PyBytes_FromString(out.toByteArray().constData());
  60. case QMetaType::QString:
  61. return PyUnicode_FromString(out.toByteArray().constData());
  62. case QMetaType::Short:
  63. case QMetaType::Long:
  64. case QMetaType::LongLong:
  65. case QMetaType::UShort:
  66. case QMetaType::ULong:
  67. case QMetaType::ULongLong:
  68. case QMetaType::Int:
  69. case QMetaType::UInt:
  70. return PyLong_FromDouble(out.toFloat());
  71. case QMetaType::Double:
  72. case QMetaType::Float:
  73. case QMetaType::Float16:
  74. return PyFloat_FromDouble(out.toFloat());
  75. case QMetaType::Bool:
  76. if (out.toBool()) {
  77. Py_RETURN_TRUE;
  78. }
  79. Py_RETURN_FALSE;
  80. default:
  81. break;
  82. }
  83. return nullptr;
  84. }
  85. // Helper for QSettings::value() to convert a value to the desired type
  86. static PyObject *settingsTypeCoercion(const QVariant &out, PyTypeObject *typeObj)
  87. {
  88. if (typeObj == &PyList_Type) {
  89. // Convert any string, etc, to a list of 1 element
  90. if (auto *primitiveValue = convertToPrimitiveType(out, out.typeId())) {
  91. PyObject *list = PyList_New(1);
  92. PyList_SetItem(list, 0, primitiveValue);
  93. return list;
  94. }
  95. const QByteArray out_ba = out.toByteArray();
  96. if (out_ba.isEmpty())
  97. return PyList_New(0);
  98. const QByteArrayList valuesList = out_ba.split(',');
  99. const Py_ssize_t valuesSize = valuesList.size();
  100. PyObject *list = PyList_New(valuesSize);
  101. for (Py_ssize_t i = 0; i < valuesSize; ++i) {
  102. PyObject *item = PyUnicode_FromString(valuesList.at(i).constData());
  103. PyList_SetItem(list, i, item);
  104. }
  105. return list;
  106. }
  107. if (typeObj == &PyBytes_Type)
  108. return convertToPrimitiveType(out, QMetaType::QByteArray);
  109. if (typeObj == &PyUnicode_Type)
  110. return convertToPrimitiveType(out, QMetaType::QString);
  111. if (typeObj == &PyLong_Type)
  112. return convertToPrimitiveType(out, QMetaType::Int);
  113. if (typeObj == &PyFloat_Type)
  114. return convertToPrimitiveType(out, QMetaType::Double);
  115. if (typeObj == &PyBool_Type)
  116. return convertToPrimitiveType(out, QMetaType::Bool);
  117. // TODO: PyDict_Type and PyTuple_Type
  118. PyErr_SetString(PyExc_TypeError,
  119. "Invalid type parameter.\n"
  120. "\tUse 'list', 'bytes', 'str', 'int', 'float', 'bool', "
  121. "or a Qt-derived type");
  122. return nullptr;
  123. }
  124. static bool isEquivalentSettingsType(PyTypeObject *typeObj, int metaTypeId)
  125. {
  126. switch (metaTypeId) {
  127. case QMetaType::QVariantList:
  128. case QMetaType::QStringList:
  129. return typeObj == &PyList_Type;
  130. case QMetaType::QByteArray:
  131. return typeObj == &PyBytes_Type;
  132. case QMetaType::QString:
  133. return typeObj == &PyUnicode_Type;
  134. case QMetaType::Short:
  135. case QMetaType::Long:
  136. case QMetaType::LongLong:
  137. case QMetaType::UShort:
  138. case QMetaType::ULong:
  139. case QMetaType::ULongLong:
  140. case QMetaType::Int:
  141. case QMetaType::UInt:
  142. return typeObj == &PyLong_Type;
  143. case QMetaType::Double:
  144. case QMetaType::Float:
  145. case QMetaType::Float16:
  146. return typeObj == &PyFloat_Type;
  147. case QMetaType::Bool:
  148. return typeObj == &PyBool_Type;
  149. default:
  150. break;
  151. }
  152. return false;
  153. }
  154. // @snippet settings-value-helpers
  155. // @snippet qsettings-value
  156. // If we enter the kwds, means that we have a defaultValue or
  157. // at least a type.
  158. // This avoids that we are passing '0' as defaultValue.
  159. // defaultValue can also be passed as positional argument,
  160. // not only as keyword.
  161. // PySide-535: Allow for empty dict instead of nullptr in PyPy
  162. QVariant out;
  163. if ((kwds && PyDict_Size(kwds) > 0) || numArgs > 1) {
  164. Py_BEGIN_ALLOW_THREADS
  165. out = %CPPSELF.value(%1, %2);
  166. Py_END_ALLOW_THREADS
  167. } else {
  168. Py_BEGIN_ALLOW_THREADS
  169. out = %CPPSELF.value(%1);
  170. Py_END_ALLOW_THREADS
  171. }
  172. PyTypeObject *typeObj = reinterpret_cast<PyTypeObject*>(%PYARG_3);
  173. if (typeObj && !Shiboken::ObjectType::checkType(typeObj)
  174. && !isEquivalentSettingsType(typeObj, out.typeId())) {
  175. %PYARG_0 = settingsTypeCoercion(out, typeObj);
  176. } else {
  177. if (out.isValid()) {
  178. %PYARG_0 = %CONVERTTOPYTHON[QVariant](out);
  179. } else {
  180. Py_INCREF(Py_None);
  181. %PYARG_0 = Py_None;
  182. }
  183. }
  184. // @snippet qsettings-value
  185. // @snippet metatype-from-type
  186. %0 = new %TYPE(PySide::qMetaTypeFromPyType(reinterpret_cast<PyTypeObject *>(%1)));
  187. // @snippet metatype-from-type
  188. // @snippet metatype-from-metatype-type
  189. Shiboken::AutoDecRef intArg(PyObject_GetAttrString(%PYARG_1, "value"));
  190. %0 = new %TYPE(PyLong_AsLong(intArg));
  191. // @snippet metatype-from-metatype-type
  192. // @snippet conversion-pytypeobject-qmetatype
  193. auto *pyType = reinterpret_cast<PyTypeObject *>(%in);
  194. %out = PySide::qMetaTypeFromPyType(pyType);
  195. // @snippet conversion-pytypeobject-qmetatype
  196. // @snippet conversion-qmetatype-pytypeobject
  197. auto pyType = Shiboken::Conversions::getPythonTypeObject(%in.name());
  198. %out = pyType ? (reinterpret_cast<PyObject *>(pyType)) : Py_None;
  199. Py_INCREF(%out);
  200. return %out;
  201. // @snippet conversion-qmetatype-pytypeobject
  202. // @snippet qvariant-conversion
  203. using SpecificConverter = Shiboken::Conversions::SpecificConverter;
  204. static std::optional<SpecificConverter> converterForQtType(const char *typeNameC)
  205. {
  206. // Fix typedef "QGenericMatrix<3,3,float>" -> QMatrix3x3". The reverse
  207. // conversion happens automatically in QMetaType::fromName() in
  208. // QVariant_resolveMetaType().
  209. QByteArrayView typeNameV(typeNameC);
  210. if (typeNameV.startsWith("QGenericMatrix<") && typeNameV.endsWith(",float>")) {
  211. QByteArray typeName = typeNameV.toByteArray();
  212. typeName.remove(1, 7);
  213. typeName.remove(7, 1); // '<'
  214. typeName.chop(7);
  215. typeName.replace(',', 'x');
  216. SpecificConverter matrixConverter(typeName.constData());
  217. if (matrixConverter)
  218. return matrixConverter;
  219. }
  220. SpecificConverter converter(typeNameC);
  221. if (converter)
  222. return converter;
  223. return std::nullopt;
  224. }
  225. // @snippet qvariant-conversion
  226. // @snippet qt-qabs
  227. double _abs = qAbs(%1);
  228. %PYARG_0 = %CONVERTTOPYTHON[double](_abs);
  229. // @snippet qt-qabs
  230. // @snippet qt-addpostroutine
  231. PySide::addPostRoutine(%1);
  232. // @snippet qt-addpostroutine
  233. // @snippet qt-qaddpostroutine
  234. qAddPostRoutine(PySide::globalPostRoutineCallback);
  235. // @snippet qt-qaddpostroutine
  236. // @snippet qcompress-buffer
  237. auto *ptr = reinterpret_cast<uchar*>(Shiboken::Buffer::getPointer(%PYARG_1));
  238. QByteArray compressed = %FUNCTION_NAME(ptr, %2, %3);
  239. %PYARG_0 = %CONVERTTOPYTHON[QByteArray](compressed);
  240. // @snippet qcompress-buffer
  241. // @snippet quncompress-buffer
  242. auto *ptr = reinterpret_cast<uchar*>(Shiboken::Buffer::getPointer(%PYARG_1));
  243. QByteArray uncompressed = %FUNCTION_NAME(ptr, %2);
  244. %PYARG_0 = %CONVERTTOPYTHON[QByteArray](uncompressed);
  245. // @snippet quncompress-buffer
  246. // @snippet qt-version
  247. QList<QByteArray> version = QByteArray(qVersion()).split('.');
  248. PyObject *pyQtVersion = PyTuple_New(3);
  249. for (int i = 0; i < 3; ++i)
  250. PyTuple_SetItem(pyQtVersion, i, PyLong_FromLong(version[i].toInt()));
  251. PepModule_Add(module, "__version_info__", pyQtVersion);
  252. PyModule_AddStringConstant(module, "__version__", qVersion());
  253. // @snippet qt-version
  254. // @snippet qobject-connect
  255. #include <qobjectconnect.h>
  256. // @snippet qobject-connect
  257. // @snippet qobject-connect-1
  258. // %FUNCTION_NAME() - disable generation of function call.
  259. %RETURN_TYPE %0 = PySide::qobjectConnect(%1, %2, %CPPSELF, %3, %4);
  260. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  261. // @snippet qobject-connect-1
  262. // @snippet qobject-connect-2
  263. // %FUNCTION_NAME() - disable generation of function call.
  264. %RETURN_TYPE %0 = PySide::qobjectConnect(%1, %2, %3, %4, %5);
  265. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  266. // @snippet qobject-connect-2
  267. // @snippet qobject-connect-3
  268. // %FUNCTION_NAME() - disable generation of function call.
  269. %RETURN_TYPE %0 = PySide::qobjectConnect(%1, %2, %3, %4, %5);
  270. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  271. // @snippet qobject-connect-3
  272. // @snippet qobject-connect-4
  273. // %FUNCTION_NAME() - disable generation of function call.
  274. %RETURN_TYPE %0 = PySide::qobjectConnectCallback(%1, %2, %PYARG_3, %4);
  275. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  276. // @snippet qobject-connect-4
  277. // @snippet qobject-connect-4-context
  278. // %FUNCTION_NAME() - disable generation of function call.
  279. %RETURN_TYPE %0 = PySide::qobjectConnectCallback(%1, %2, %3, %PYARG_4, %5);
  280. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  281. // @snippet qobject-connect-4-context
  282. // @snippet qobject-connect-5
  283. // %FUNCTION_NAME() - disable generation of function call.
  284. %RETURN_TYPE %0 = PySide::qobjectConnectCallback(%CPPSELF, %1, %PYARG_2, %3);
  285. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  286. // @snippet qobject-connect-5
  287. // @snippet qobject-connect-6
  288. // %FUNCTION_NAME() - disable generation of function call.
  289. %RETURN_TYPE %0 = PySide::qobjectConnect(%CPPSELF, %1, %2, %3, %4);
  290. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  291. // @snippet qobject-connect-6
  292. // @snippet qobject-emit
  293. %RETURN_TYPE %0 = PySide::SignalManager::emitSignal(%CPPSELF, %1, %PYARG_2);
  294. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  295. // @snippet qobject-emit
  296. // @snippet qobject-disconnect-1
  297. // %FUNCTION_NAME() - disable generation of function call.
  298. %RETURN_TYPE %0 = PySide::qobjectDisconnectCallback(%CPPSELF, %1, %2);
  299. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  300. // @snippet qobject-disconnect-1
  301. // @snippet qobject-disconnect-2
  302. // %FUNCTION_NAME() - disable generation of function call.
  303. %RETURN_TYPE %0 = PySide::qobjectDisconnectCallback(%1, %2, %3);
  304. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  305. // @snippet qobject-disconnect-2
  306. // @snippet qfatal
  307. // qFatal doesn't have a stream version, so we do a
  308. // qWarning call followed by a qFatal() call using a
  309. // literal.
  310. Py_BEGIN_ALLOW_THREADS
  311. qWarning() << %1;
  312. qFatal("[A qFatal() call was made from Python code]");
  313. Py_END_ALLOW_THREADS
  314. // @snippet qfatal
  315. // @snippet moduleshutdown
  316. PySide::runCleanupFunctions();
  317. // @snippet moduleshutdown
  318. // @snippet qt-qenum
  319. %PYARG_0 = PySide::QEnum::QEnumMacro(%1, false);
  320. // @snippet qt-qenum
  321. // @snippet qt-qflag
  322. %PYARG_0 = PySide::QEnum::QEnumMacro(%1, true);
  323. // @snippet qt-qflag
  324. // @snippet qt-init-feature
  325. PySide::Feature::init();
  326. // @snippet qt-init-feature
  327. // @snippet qt-pysideinit
  328. Shiboken::Conversions::registerConverterName(SbkPySide6_QtCoreTypeConverters[SBK_QString_IDX], "unicode");
  329. Shiboken::Conversions::registerConverterName(SbkPySide6_QtCoreTypeConverters[SBK_QString_IDX], "str");
  330. Shiboken::Conversions::registerConverterName(SbkPySide6_QtCoreTypeConverters[SBK_QtCore_QList_QVariant_IDX], "QVariantList");
  331. Shiboken::Conversions::registerConverterName(SbkPySide6_QtCoreTypeConverters[SBK_QtCore_QMap_QString_QVariant_IDX], "QVariantMap");
  332. PySide::registerInternalQtConf();
  333. PySide::init(module);
  334. // @snippet qt-pysideinit
  335. // @snippet qt-messagehandler
  336. // Define a global variable to handle qInstallMessageHandler callback
  337. static PyObject *qtmsghandler = nullptr;
  338. static void msgHandlerCallback(QtMsgType type, const QMessageLogContext &ctx, const QString &msg)
  339. {
  340. Shiboken::GilState state;
  341. Shiboken::Errors::Stash errorStash;
  342. Shiboken::AutoDecRef arglist(PyTuple_New(3));
  343. PyTuple_SetItem(arglist, 0, %CONVERTTOPYTHON[QtMsgType](type));
  344. PyTuple_SetItem(arglist, 1, %CONVERTTOPYTHON[QMessageLogContext &](ctx));
  345. QByteArray array = msg.toUtf8(); // Python handler requires UTF-8
  346. const char *data = array.constData();
  347. PyTuple_SetItem(arglist, 2, %CONVERTTOPYTHON[const char *](data));
  348. Shiboken::AutoDecRef ret(PyObject_CallObject(qtmsghandler, arglist));
  349. }
  350. // @snippet qt-messagehandler
  351. // @snippet qt-installmessagehandler
  352. if (%PYARG_1 == Py_None) {
  353. qInstallMessageHandler(0);
  354. %PYARG_0 = qtmsghandler ? qtmsghandler : Py_None;
  355. qtmsghandler = 0;
  356. } else if (!PyCallable_Check(%PYARG_1)) {
  357. PyErr_SetString(PyExc_TypeError, "parameter must be callable");
  358. } else {
  359. %PYARG_0 = qtmsghandler ? qtmsghandler : Py_None;
  360. Py_INCREF(%PYARG_1);
  361. qtmsghandler = %PYARG_1;
  362. qInstallMessageHandler(msgHandlerCallback);
  363. }
  364. if (%PYARG_0 == Py_None)
  365. Py_INCREF(%PYARG_0);
  366. // @snippet qt-installmessagehandler
  367. // @snippet qline-hash
  368. namespace PySide {
  369. template<> inline Py_ssize_t hash(const QLine &l)
  370. {
  371. return qHashMulti(0, l.x1(), l.y1(), l.x2(), l.y2());
  372. }
  373. };
  374. // @snippet qline-hash
  375. // @snippet qlinef-intersect
  376. QPointF p;
  377. %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, &p);
  378. %PYARG_0 = PyTuple_New(2);
  379. PyTuple_SetItem(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](retval));
  380. PyTuple_SetItem(%PYARG_0, 1, %CONVERTTOPYTHON[QPointF](p));
  381. // @snippet qlinef-intersect
  382. // @snippet qresource-data
  383. const void *d = %CPPSELF.%FUNCTION_NAME();
  384. if (d) {
  385. %PYARG_0 = Shiboken::Buffer::newObject(d, %CPPSELF.size());
  386. } else {
  387. Py_INCREF(Py_None);
  388. %PYARG_0 = Py_None;
  389. }
  390. // @snippet qresource-data
  391. // @snippet qdate-topython
  392. if (!PyDateTimeAPI)
  393. PyDateTime_IMPORT;
  394. %PYARG_0 = PyDate_FromDate(%CPPSELF.year(), %CPPSELF.month(), %CPPSELF.day());
  395. // @snippet qdate-topython
  396. // @snippet qdate-getdate
  397. int year, month, day;
  398. %CPPSELF.%FUNCTION_NAME(&year, &month, &day);
  399. %PYARG_0 = PyTuple_New(3);
  400. PyTuple_SetItem(%PYARG_0, 0, %CONVERTTOPYTHON[int](year));
  401. PyTuple_SetItem(%PYARG_0, 1, %CONVERTTOPYTHON[int](month));
  402. PyTuple_SetItem(%PYARG_0, 2, %CONVERTTOPYTHON[int](day));
  403. // @snippet qdate-getdate
  404. // @snippet qdate-weeknumber
  405. int yearNumber;
  406. int week = %CPPSELF.%FUNCTION_NAME(&yearNumber);
  407. %PYARG_0 = PyTuple_New(2);
  408. PyTuple_SetItem(%PYARG_0, 0, %CONVERTTOPYTHON[int](week));
  409. PyTuple_SetItem(%PYARG_0, 1, %CONVERTTOPYTHON[int](yearNumber));
  410. // @snippet qdate-weeknumber
  411. // @snippet qdatetime-1
  412. QDate date(%1, %2, %3);
  413. QTime time(%4, %5, %6, %7);
  414. %0 = new %TYPE(date, time,
  415. Qt::TimeSpec(%8) == Qt::UTC
  416. ? QTimeZone(QTimeZone::UTC) : QTimeZone(QTimeZone::LocalTime));
  417. Shiboken::Warnings::warnDeprecated("QDateTime", "QDateTime(..., Qt::TimeSpec spec)");
  418. // @snippet qdatetime-1
  419. // @snippet qdatetime-2
  420. QDate date(%1, %2, %3);
  421. QTime time(%4, %5, %6);
  422. %0 = new %TYPE(date, time);
  423. // @snippet qdatetime-2
  424. // @snippet qdatetime-3
  425. QDate date(%1, %2, %3);
  426. QTime time(%4, %5, %6, %7);
  427. %0 = new %TYPE(date, time,
  428. %8 == Qt::UTC ? QTimeZone(QTimeZone::UTC) : QTimeZone(QTimeZone::LocalTime));
  429. Shiboken::Warnings::warnDeprecated("QDateTime", "QDateTime(..., Qt::TimeSpec spec)");
  430. // @snippet qdatetime-3
  431. // @snippet qdatetime-4
  432. QDate date(%1, %2, %3);
  433. QTime time(%4, %5, %6, %7);
  434. %0 = new %TYPE(date, time, QTimeZone(%8));
  435. // @snippet qdatetime-4
  436. // @snippet qdatetime-topython
  437. QDate date = %CPPSELF.date();
  438. QTime time = %CPPSELF.time();
  439. if (!PyDateTimeAPI)
  440. PyDateTime_IMPORT;
  441. %PYARG_0 = PyDateTime_FromDateAndTime(date.year(), date.month(), date.day(), time.hour(), time.minute(), time.second(), time.msec()*1000);
  442. // @snippet qdatetime-topython
  443. // @snippet qtime-topython
  444. if (!PyDateTimeAPI)
  445. PyDateTime_IMPORT;
  446. %PYARG_0 = PyTime_FromTime(%CPPSELF.hour(), %CPPSELF.minute(), %CPPSELF.second(), %CPPSELF.msec()*1000);
  447. // @snippet qtime-topython
  448. // @snippet qbitarray-len
  449. return %CPPSELF.size();
  450. // @snippet qbitarray-len
  451. // @snippet qbitarray-getitem
  452. const Py_ssize_t size = %CPPSELF.size();
  453. if (_i < 0 || _i >= size) {
  454. Shiboken::Errors::setIndexOutOfBounds(_i, 0, size);
  455. return nullptr;
  456. }
  457. bool ret = %CPPSELF.at(_i);
  458. return %CONVERTTOPYTHON[bool](ret);
  459. // @snippet qbitarray-getitem
  460. // @snippet qbitarray-setitem
  461. PyObject *args = Py_BuildValue("(iiO)", _i, 1, _value);
  462. PyObject *result = Sbk_QBitArrayFunc_setBit(self, args);
  463. Py_DECREF(args);
  464. Py_XDECREF(result);
  465. return !result ? -1 : 0;
  466. // @snippet qbitarray-setitem
  467. // @snippet qmodelroledata-setdata
  468. // Call template <typename T> void QModelRoleData::setData(T &&value)
  469. %CPPSELF.%FUNCTION_NAME(%1);
  470. // @snippet qmodelroledata-setdata
  471. // @snippet qmodelroledataspan-len
  472. return %CPPSELF.size();
  473. // @snippet qmodelroledataspan-len
  474. // @snippet qmodelroledataspan-getitem
  475. const Py_ssize_t size = %CPPSELF.size();
  476. if (_i < 0 || _i >= size) {
  477. Shiboken::Errors::setIndexOutOfBounds(_i, 0, size);
  478. return nullptr;
  479. }
  480. // Return a pointer to allow for modification using QModelRoleData::setData()
  481. QModelRoleData *item = &((*%CPPSELF)[_i]);
  482. return %CONVERTTOPYTHON[QModelRoleData *](item);
  483. // @snippet qmodelroledataspan-getitem
  484. // @snippet default-enter
  485. Py_INCREF(%PYSELF);
  486. pyResult = %PYSELF;
  487. // @snippet default-enter
  488. // @snippet qsignalblocker-unblock
  489. %CPPSELF.unblock();
  490. // @snippet qsignalblocker-unblock
  491. // @snippet unlock
  492. %CPPSELF.unlock();
  493. // @snippet unlock
  494. // @snippet qabstractitemmodel-createindex
  495. %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(%1, %2, %PYARG_3);
  496. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  497. // @snippet qabstractitemmodel-createindex
  498. // @snippet qabstractitemmodel
  499. qRegisterMetaType<QList<int> >("QList<int>");
  500. // @snippet qabstractitemmodel
  501. // @snippet qobject-metaobject
  502. %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME();
  503. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  504. // @snippet qobject-metaobject
  505. // @snippet qobject-findchild-2
  506. QObject *child = qObjectFindChild(%CPPSELF, %2, reinterpret_cast<PyTypeObject *>(%PYARG_1), %3);
  507. %PYARG_0 = %CONVERTTOPYTHON[QObject *](child);
  508. // @snippet qobject-findchild-2
  509. // @snippet qobject-findchildren
  510. %PYARG_0 = PyList_New(0);
  511. qObjectFindChildren(%CPPSELF, %2, reinterpret_cast<PyTypeObject *>(%PYARG_1), %3,
  512. [%PYARG_0](QObject *child) {
  513. Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QObject *](child));
  514. PyList_Append(%PYARG_0, pyChild.object());
  515. });
  516. // @snippet qobject-findchildren
  517. // @snippet qobject-tr
  518. const QString result = qObjectTr(reinterpret_cast<PyTypeObject *>(%PYSELF), %1, %2, %3);
  519. %PYARG_0 = %CONVERTTOPYTHON[QString](result);
  520. // @snippet qobject-tr
  521. // @snippet qobject-sender
  522. // Retrieve the sender from a dynamic property set by GlobalReceiverV2 in case of a
  523. // non-C++ slot (Python callback).
  524. auto *ret = %CPPSELF.%FUNCTION_NAME();
  525. if (ret == nullptr) {
  526. auto senderV = %CPPSELF.property("_q_pyside_sender");
  527. if (senderV.typeId() == QMetaType::QObjectStar)
  528. ret = senderV.value<QObject *>();
  529. }
  530. %PYARG_0 = %CONVERTTOPYTHON[QObject*](ret);
  531. // @snippet qobject-sender
  532. // @snippet qbytearray-mgetitem
  533. if (PyIndex_Check(_key)) {
  534. const Py_ssize_t _i = PyNumber_AsSsize_t(_key, PyExc_IndexError);
  535. const Py_ssize_t size = %CPPSELF.size();
  536. if (_i < 0 || _i >= size) {
  537. Shiboken::Errors::setIndexOutOfBounds(_i, 0, size);
  538. return nullptr;
  539. }
  540. char res[2] = {%CPPSELF.at(_i), '\0'};
  541. return PyBytes_FromStringAndSize(res, 1);
  542. }
  543. if (PySlice_Check(_key) == 0)
  544. return PyErr_Format(PyExc_TypeError,
  545. "list indices must be integers or slices, not %.200s",
  546. Py_TYPE(_key)->tp_name);
  547. Py_ssize_t start{};
  548. Py_ssize_t stop{};
  549. Py_ssize_t step{};
  550. if (PySlice_Unpack(_key, &start, &stop, &step) < 0)
  551. return nullptr;
  552. Py_ssize_t slicelength = PySlice_AdjustIndices(%CPPSELF.size(), &start, &stop, step);
  553. QByteArray ba;
  554. if (slicelength <= 0)
  555. return %CONVERTTOPYTHON[QByteArray](ba);
  556. if (step == 1) {
  557. Py_ssize_t max = %CPPSELF.size();
  558. start = qBound(Py_ssize_t(0), start, max);
  559. stop = qBound(Py_ssize_t(0), stop, max);
  560. if (start < stop)
  561. ba = %CPPSELF.mid(start, stop - start);
  562. return %CONVERTTOPYTHON[QByteArray](ba);
  563. }
  564. for (Py_ssize_t cur = start; slicelength > 0; cur += step, --slicelength)
  565. ba.append(%CPPSELF.at(cur));
  566. return %CONVERTTOPYTHON[QByteArray](ba);
  567. // @snippet qbytearray-mgetitem
  568. // @snippet qbytearray-msetitem
  569. // PYSIDE-2404: Usage of the `get()` function not necessary, the type exists.
  570. if (PyIndex_Check(_key)) {
  571. Py_ssize_t _i = PyNumber_AsSsize_t(_key, PyExc_IndexError);
  572. if (_i == -1 && PyErr_Occurred())
  573. return -1;
  574. if (_i < 0)
  575. _i += %CPPSELF.size();
  576. if (_i < 0 || _i >= %CPPSELF.size()) {
  577. PyErr_SetString(PyExc_IndexError, "QByteArray index out of range");
  578. return -1;
  579. }
  580. // Provide more specific error message for bytes/str, bytearray, QByteArray respectively
  581. if (PyBytes_Check(_value)) {
  582. if (Py_SIZE(_value) != 1) {
  583. PyErr_SetString(PyExc_ValueError, "bytes must be of size 1");
  584. return -1;
  585. }
  586. } else if (PyByteArray_Check(_value)) {
  587. if (Py_SIZE(_value) != 1) {
  588. PyErr_SetString(PyExc_ValueError, "bytearray must be of size 1");
  589. return -1;
  590. }
  591. } else if (Py_TYPE(_value) == reinterpret_cast<PyTypeObject *>(
  592. SbkPySide6_QtCoreTypeStructs[SBK_QByteArray_IDX].type)) {
  593. if (PyObject_Length(_value) != 1) {
  594. PyErr_SetString(PyExc_ValueError, "QByteArray must be of size 1");
  595. return -1;
  596. }
  597. } else {
  598. PyErr_SetString(PyExc_ValueError, "a bytes, bytearray, QByteArray of size 1 is required");
  599. return -1;
  600. }
  601. // Not support int or long.
  602. %CPPSELF.remove(_i, 1);
  603. PyObject *args = Py_BuildValue("(nO)", _i, _value);
  604. PyObject *result = Sbk_QByteArrayFunc_insert(self, args);
  605. Py_DECREF(args);
  606. Py_XDECREF(result);
  607. return result != nullptr ? 0: -1;
  608. }
  609. if (PySlice_Check(_key) == 0) {
  610. PyErr_Format(PyExc_TypeError, "QBytearray indices must be integers or slices, not %.200s",
  611. Py_TYPE(_key)->tp_name);
  612. return -1;
  613. }
  614. Py_ssize_t start{};
  615. Py_ssize_t stop{};
  616. Py_ssize_t step{};
  617. if (PySlice_Unpack(_key, &start, &stop, &step) < 0)
  618. return -1;
  619. const Py_ssize_t slicelength = PySlice_AdjustIndices(%CPPSELF.size(), &start, &stop, step);
  620. // The parameter candidates are: bytes/str, bytearray, QByteArray itself.
  621. // Not supported are iterables containing ints between 0~255
  622. // case 1: value is nullpre, means delete the items within the range
  623. // case 2: step is 1, means shrink or expand
  624. // case 3: step is not 1, then the number of slots have to equal the number of items in _value
  625. Py_ssize_t value_length = 0;
  626. if (_value != nullptr && _value != Py_None) {
  627. if (!(PyBytes_Check(_value) || PyByteArray_Check(_value)
  628. || Py_TYPE(_value) == SbkPySide6_QtCoreTypeStructs[SBK_QByteArray_IDX].type)) {
  629. PyErr_Format(PyExc_TypeError, "bytes, bytearray or QByteArray is required, not %.200s",
  630. Py_TYPE(_value)->tp_name);
  631. return -1;
  632. }
  633. value_length = PyObject_Length(_value);
  634. }
  635. if (step != 1 && value_length != slicelength) {
  636. PyErr_Format(PyExc_ValueError, "attempt to assign %s of size %d to extended slice of size %d",
  637. Py_TYPE(_value)->tp_name, int(value_length), int(slicelength));
  638. return -1;
  639. }
  640. if (step != 1) {
  641. Py_ssize_t i = start;
  642. for (Py_ssize_t j = 0; j < slicelength; ++j) {
  643. PyObject *item = PyObject_GetItem(_value, PyLong_FromSsize_t(j));
  644. QByteArray temp;
  645. if (PyLong_Check(item)) {
  646. int overflow;
  647. const long ival = PyLong_AsLongAndOverflow(item, &overflow);
  648. // Not supposed to be bigger than 255 because only bytes,
  649. // bytearray, QByteArray were accepted
  650. temp.append(char(ival));
  651. } else {
  652. temp = %CONVERTTOCPP[QByteArray](item);
  653. }
  654. %CPPSELF.replace(i, 1, temp);
  655. i += step;
  656. }
  657. return 0;
  658. }
  659. QByteArray ba = %CONVERTTOCPP[QByteArray](_value);
  660. %CPPSELF.replace(start, slicelength, ba);
  661. return 0;
  662. // @snippet qbytearray-msetitem
  663. // @snippet qbytearray-bufferprotocol
  664. extern "C" {
  665. // QByteArray buffer protocol functions
  666. // see: http://www.python.org/dev/peps/pep-3118/
  667. static int SbkQByteArray_getbufferproc(PyObject *obj, Py_buffer *view, int flags)
  668. {
  669. if (!view || !Shiboken::Object::isValid(obj))
  670. return -1;
  671. QByteArray * cppSelf = %CONVERTTOCPP[QByteArray *](obj);
  672. //XXX /|\ omitting this space crashes shiboken!
  673. #ifdef Py_LIMITED_API
  674. view->obj = obj;
  675. view->buf = reinterpret_cast<void *>(cppSelf->data());
  676. view->len = cppSelf->size();
  677. view->readonly = 0;
  678. view->itemsize = 1;
  679. view->format = (flags & PyBUF_FORMAT) == PyBUF_FORMAT ? const_cast<char *>("B") : nullptr;
  680. view->ndim = 1;
  681. view->shape = (flags & PyBUF_ND) == PyBUF_ND ? &(view->len) : nullptr;
  682. view->strides = (flags & PyBUF_STRIDES) == PyBUF_STRIDES ? &(view->itemsize) : nullptr;
  683. view->suboffsets = nullptr;
  684. view->internal = nullptr;
  685. Py_XINCREF(obj);
  686. return 0;
  687. #else // Py_LIMITED_API
  688. const int result = PyBuffer_FillInfo(view, obj, reinterpret_cast<void *>(cppSelf->data()),
  689. cppSelf->size(), 0, flags);
  690. if (result == 0)
  691. Py_XINCREF(obj);
  692. return result;
  693. #endif
  694. }
  695. static PyBufferProcs SbkQByteArrayBufferProc = {
  696. /*bf_getbuffer*/ (getbufferproc)SbkQByteArray_getbufferproc,
  697. /*bf_releasebuffer*/ (releasebufferproc)0,
  698. };
  699. }
  700. // @snippet qbytearray-bufferprotocol
  701. // @snippet qbytearray-operatorplus-1
  702. QByteArray ba = QByteArray(PyBytes_AsString(%PYARG_1), PyBytes_Size(%PYARG_1)) + *%CPPSELF;
  703. %PYARG_0 = %CONVERTTOPYTHON[QByteArray](ba);
  704. // @snippet qbytearray-operatorplus-1
  705. // @snippet qbytearray-operatorplus-2
  706. QByteArray ba = QByteArray(PyByteArray_AsString(%PYARG_1), PyByteArray_Size(%PYARG_1)) + *%CPPSELF;
  707. %PYARG_0 = %CONVERTTOPYTHON[QByteArray](ba);
  708. // @snippet qbytearray-operatorplus-2
  709. // @snippet qbytearray-operatorplus-3
  710. QByteArray ba = *%CPPSELF + QByteArray(PyByteArray_AsString(%PYARG_1), PyByteArray_Size(%PYARG_1));
  711. %PYARG_0 = %CONVERTTOPYTHON[QByteArray](ba);
  712. // @snippet qbytearray-operatorplus-3
  713. // @snippet qbytearray-operatorplusequal
  714. *%CPPSELF += QByteArray(PyByteArray_AsString(%PYARG_1), PyByteArray_Size(%PYARG_1));
  715. // @snippet qbytearray-operatorplusequal
  716. // @snippet qbytearray-operatorequalequal
  717. if (PyUnicode_CheckExact(%PYARG_1)) {
  718. Shiboken::AutoDecRef data(PyUnicode_AsASCIIString(%PYARG_1));
  719. QByteArray ba = QByteArray(PyBytes_AsString(data.object()), PyBytes_Size(data.object()));
  720. bool cppResult = %CPPSELF == ba;
  721. %PYARG_0 = %CONVERTTOPYTHON[bool](cppResult);
  722. }
  723. // @snippet qbytearray-operatorequalequal
  724. // @snippet qbytearray-operatornotequal
  725. if (PyUnicode_CheckExact(%PYARG_1)) {
  726. Shiboken::AutoDecRef data(PyUnicode_AsASCIIString(%PYARG_1));
  727. QByteArray ba = QByteArray(PyBytes_AsString(data.object()), PyBytes_Size(data.object()));
  728. bool cppResult = %CPPSELF != ba;
  729. %PYARG_0 = %CONVERTTOPYTHON[bool](cppResult);
  730. }
  731. // @snippet qbytearray-operatornotequal
  732. // @snippet qbytearray-operatorgreater
  733. if (PyUnicode_CheckExact(%PYARG_1)) {
  734. Shiboken::AutoDecRef data(PyUnicode_AsASCIIString(%PYARG_1));
  735. QByteArray ba = QByteArray(PyBytes_AsString(data.object()), PyBytes_Size(data.object()));
  736. bool cppResult = %CPPSELF > ba;
  737. %PYARG_0 = %CONVERTTOPYTHON[bool](cppResult);
  738. }
  739. // @snippet qbytearray-operatorgreater
  740. // @snippet qbytearray-operatorgreaterequal
  741. if (PyUnicode_CheckExact(%PYARG_1)) {
  742. Shiboken::AutoDecRef data(PyUnicode_AsASCIIString(%PYARG_1));
  743. QByteArray ba = QByteArray(PyBytes_AsString(data.object()), PyBytes_Size(data.object()));
  744. bool cppResult = %CPPSELF >= ba;
  745. %PYARG_0 = %CONVERTTOPYTHON[bool](cppResult);
  746. }
  747. // @snippet qbytearray-operatorgreaterequal
  748. // @snippet qbytearray-operatorlower
  749. if (PyUnicode_CheckExact(%PYARG_1)) {
  750. Shiboken::AutoDecRef data(PyUnicode_AsASCIIString(%PYARG_1));
  751. QByteArray ba = QByteArray(PyBytes_AsString(data.object()), PyBytes_Size(data.object()));
  752. bool cppResult = %CPPSELF < ba;
  753. %PYARG_0 = %CONVERTTOPYTHON[bool](cppResult);
  754. }
  755. // @snippet qbytearray-operatorlower
  756. // @snippet qbytearray-operatorlowerequal
  757. if (PyUnicode_CheckExact(%PYARG_1)) {
  758. Shiboken::AutoDecRef data(PyUnicode_AsASCIIString(%PYARG_1));
  759. QByteArray ba = QByteArray(PyBytes_AsString(data.object()), PyBytes_Size(data.object()));
  760. bool cppResult = %CPPSELF <= ba;
  761. %PYARG_0 = %CONVERTTOPYTHON[bool](cppResult);
  762. }
  763. // @snippet qbytearray-operatorlowerequal
  764. // @snippet qbytearray-repr
  765. PyObject *aux = PyBytes_FromStringAndSize(%CPPSELF.constData(), %CPPSELF.size());
  766. if (aux == nullptr) {
  767. return nullptr;
  768. }
  769. QByteArray b(Py_TYPE(%PYSELF)->tp_name);
  770. %PYARG_0 = PyUnicode_FromFormat("%s(%R)", b.constData(), aux);
  771. Py_DECREF(aux);
  772. // @snippet qbytearray-repr
  773. // @snippet qbytearray-2
  774. %0 = new QByteArray(PyByteArray_AsString(%PYARG_1), PyByteArray_Size(%PYARG_1));
  775. // @snippet qbytearray-2
  776. // @snippet qbytearray-3
  777. %0 = new QByteArray(PyBytes_AsString(%PYARG_1), PyBytes_Size(%PYARG_1));
  778. // @snippet qbytearray-3
  779. // @snippet qbytearray-py3
  780. PepType_AS_BUFFER(Shiboken::SbkType<QByteArray>()) = &SbkQByteArrayBufferProc;
  781. // @snippet qbytearray-py3
  782. // @snippet qbytearray-data
  783. %PYARG_0 = PyBytes_FromStringAndSize(%CPPSELF.%FUNCTION_NAME(), %CPPSELF.size());
  784. // @snippet qbytearray-data
  785. // @snippet qbytearray-str
  786. PyObject *aux = PyBytes_FromStringAndSize(%CPPSELF.constData(), %CPPSELF.size());
  787. if (aux == nullptr) {
  788. return nullptr;
  789. }
  790. %PYARG_0 = PyObject_Repr(aux);
  791. Py_DECREF(aux);
  792. // @snippet qbytearray-str
  793. // @snippet qbytearray-len
  794. return %CPPSELF.size();
  795. // @snippet qbytearray-len
  796. // @snippet qbytearray-getitem
  797. const Py_ssize_t size = %CPPSELF.size();
  798. if (_i < 0 || _i >= size) {
  799. Shiboken::Errors::setIndexOutOfBounds(_i, 0, size);
  800. return nullptr;
  801. }
  802. char res[2];
  803. res[0] = %CPPSELF.at(_i);
  804. res[1] = 0;
  805. return PyBytes_FromStringAndSize(res, 1);
  806. // @snippet qbytearray-getitem
  807. // @snippet qbytearray-setitem
  808. %CPPSELF.remove(_i, 1);
  809. PyObject *args = Py_BuildValue("(nO)", _i, _value);
  810. PyObject *result = Sbk_QByteArrayFunc_insert(self, args);
  811. Py_DECREF(args);
  812. Py_XDECREF(result);
  813. return !result ? -1 : 0;
  814. // @snippet qbytearray-setitem
  815. // @snippet qfiledevice-unmap
  816. uchar *ptr = reinterpret_cast<uchar *>(Shiboken::Buffer::getPointer(%PYARG_1));
  817. %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(ptr);
  818. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  819. // @snippet qfiledevice-unmap
  820. // @snippet qfiledevice-map
  821. %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1, %2, %3), %2, Shiboken::Buffer::ReadWrite);
  822. // @snippet qfiledevice-map
  823. // @snippet qiodevice-bufferedread
  824. Py_ssize_t bufferLen;
  825. auto *data = reinterpret_cast<char*>(Shiboken::Buffer::getPointer(%PYARG_1, &bufferLen));
  826. %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(data, PyLong_AsLongLong(%PYARG_2));
  827. return PyLong_FromLong(%0);
  828. // @snippet qiodevice-bufferedread
  829. // @snippet qiodevice-readdata
  830. QByteArray ba(1 + qsizetype(%2), char(0));
  831. %CPPSELF.%FUNCTION_NAME(ba.data(), qint64(%2));
  832. %PYARG_0 = Shiboken::String::fromCString(ba.constData());
  833. // @snippet qiodevice-readdata
  834. // @snippet qcryptographichash-adddata
  835. %CPPSELF.%FUNCTION_NAME(Shiboken::String::toCString(%PYARG_1), Shiboken::String::len(%PYARG_1));
  836. // @snippet qcryptographichash-adddata
  837. // @snippet qmetaobject-repr
  838. const QByteArray repr = PySide::MetaObjectBuilder::formatMetaObject(%CPPSELF).toUtf8();
  839. %PYARG_0 = PyUnicode_FromString(repr.constData());
  840. // @snippet qmetaobject-repr
  841. // @snippet qsocketdescriptor
  842. #ifdef WIN32
  843. using DescriptorType = Qt::HANDLE;
  844. #else
  845. using DescriptorType = int;
  846. #endif
  847. // @snippet qsocketdescriptor
  848. // @snippet qsocketnotifier
  849. PyObject *socket = %PYARG_1;
  850. if (socket != nullptr) {
  851. // We use qintptr as PyLong, but we check for int
  852. // since it is currently an alias to be Python2 compatible.
  853. // Internally, ints are qlonglongs.
  854. if (%CHECKTYPE[int](socket)) {
  855. int cppSocket = %CONVERTTOCPP[int](socket);
  856. qintptr socket = (qintptr)cppSocket;
  857. %0 = new %TYPE(socket, %2, %3);
  858. } else {
  859. PyErr_SetString(PyExc_TypeError,
  860. "QSocketNotifier: first argument (socket) must be an int.");
  861. }
  862. }
  863. // @snippet qsocketnotifier
  864. // @snippet qtranslator-load
  865. Py_ssize_t size;
  866. auto *ptr = reinterpret_cast<uchar *>(Shiboken::Buffer::getPointer(%PYARG_1, &size));
  867. %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(const_cast<const uchar *>(ptr), size);
  868. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  869. // @snippet qtranslator-load
  870. // @snippet qtimer-singleshot-functorclass
  871. struct QSingleShotTimerFunctor : public Shiboken::PyObjectHolder
  872. {
  873. public:
  874. using Shiboken::PyObjectHolder::PyObjectHolder;
  875. void operator()();
  876. };
  877. void QSingleShotTimerFunctor::operator()()
  878. {
  879. Shiboken::GilState state;
  880. Shiboken::AutoDecRef arglist(PyTuple_New(0));
  881. Shiboken::AutoDecRef ret(PyObject_CallObject(object(), arglist));
  882. if (Shiboken::Errors::occurred())
  883. Shiboken::Errors::storeErrorOrPrint();
  884. release(); // single shot
  885. }
  886. // @snippet qtimer-singleshot-functorclass
  887. // @snippet qtimer-singleshot-direct-mapping
  888. Shiboken::AutoDecRef emptyTuple(PyTuple_New(0));
  889. %CPPSELF.%FUNCTION_NAME(%1, %2, %3);
  890. // @snippet qtimer-singleshot-direct-mapping
  891. // @snippet qtimer-singleshot-functor
  892. auto msec = %1;
  893. if (msec == 0) {
  894. if (PyObject_TypeCheck(%2, PySideSignalInstance_TypeF())) {
  895. auto *signal = %PYARG_2;
  896. auto cppCallback = [signal]()
  897. {
  898. Shiboken::GilState state;
  899. Shiboken::AutoDecRef ret(PyObject_CallMethod(signal, "emit", "()"));
  900. Py_DECREF(signal);
  901. };
  902. Py_INCREF(signal);
  903. %CPPSELF.%FUNCTION_NAME(msec, cppCallback);
  904. } else {
  905. %CPPSELF.%FUNCTION_NAME(msec, QSingleShotTimerFunctor(%PYARG_2));
  906. }
  907. } else {
  908. // %FUNCTION_NAME() - disable generation of c++ function call
  909. Shiboken::AutoDecRef emptyTuple(PyTuple_New(0));
  910. auto *timerType = Shiboken::SbkType<QTimer>();
  911. auto newFunc = reinterpret_cast<newfunc>(PepType_GetSlot(timerType, Py_tp_new));
  912. auto initFunc = reinterpret_cast<initproc>(PepType_GetSlot(timerType, Py_tp_init));
  913. auto *pyTimer = newFunc(Shiboken::SbkType<QTimer>(), emptyTuple, nullptr);
  914. initFunc(pyTimer, emptyTuple, nullptr);
  915. QTimer * timer = %CONVERTTOCPP[QTimer *](pyTimer);
  916. timer->setSingleShot(true);
  917. if (!PySide::callConnect(pyTimer, SIGNAL(timeout()), %PYARG_2))
  918. return nullptr;
  919. timer->connect(timer, &QTimer::timeout, timer, &QObject::deleteLater, Qt::DirectConnection);
  920. Shiboken::Object::releaseOwnership(reinterpret_cast<SbkObject *>(pyTimer));
  921. Py_XDECREF(pyTimer);
  922. timer->start(msec);
  923. }
  924. // @snippet qtimer-singleshot-functor
  925. // @snippet qtimer-singleshot-functor-context
  926. auto msec = %1;
  927. if (msec == 0) {
  928. Shiboken::AutoDecRef emptyTuple(PyTuple_New(0));
  929. auto *callable = %PYARG_3;
  930. auto cppCallback = [callable]()
  931. {
  932. Shiboken::GilState state;
  933. Shiboken::AutoDecRef arglist(PyTuple_New(0));
  934. Shiboken::AutoDecRef ret(PyObject_CallObject(callable, arglist));
  935. Py_DECREF(callable);
  936. };
  937. Py_INCREF(callable);
  938. %CPPSELF.%FUNCTION_NAME(msec, %2, cppCallback);
  939. } else {
  940. Shiboken::AutoDecRef emptyTuple(PyTuple_New(0));
  941. auto *timerType = Shiboken::SbkType<QTimer>();
  942. auto newFunc = reinterpret_cast<newfunc>(PepType_GetSlot(timerType, Py_tp_new));
  943. auto initFunc = reinterpret_cast<initproc>(PepType_GetSlot(timerType, Py_tp_init));
  944. auto *pyTimer = newFunc(Shiboken::SbkType<QTimer>(), emptyTuple, nullptr);
  945. initFunc(pyTimer, emptyTuple, nullptr);
  946. QTimer * timer = %CONVERTTOCPP[QTimer *](pyTimer);
  947. timer->setSingleShot(true);
  948. Shiboken::AutoDecRef result(
  949. PyObject_CallMethod(pyTimer, "connect", "OsOO",
  950. pyTimer,
  951. SIGNAL(timeout()),
  952. %PYARG_2,
  953. %PYARG_3)
  954. );
  955. timer->connect(timer, &QTimer::timeout, timer, &QObject::deleteLater, Qt::DirectConnection);
  956. Shiboken::Object::releaseOwnership(reinterpret_cast<SbkObject *>(pyTimer));
  957. Py_XDECREF(pyTimer);
  958. timer->start(msec);
  959. }
  960. // @snippet qtimer-singleshot-functor-context
  961. // @snippet qprocess-startdetached
  962. qint64 pid;
  963. %RETURN_TYPE retval = %TYPE::%FUNCTION_NAME(%1, %2, %3, &pid);
  964. %PYARG_0 = PyTuple_New(2);
  965. PyTuple_SetItem(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](retval));
  966. PyTuple_SetItem(%PYARG_0, 1, %CONVERTTOPYTHON[qint64](pid));
  967. // @snippet qprocess-startdetached
  968. // @snippet qcoreapplication-init
  969. static void QCoreApplicationConstructor(PyObject *self, PyObject *pyargv, QCoreApplicationWrapper **cptr)
  970. {
  971. static int argc;
  972. static char **argv;
  973. PyObject *stringlist = PyTuple_GetItem(pyargv, 0);
  974. if (Shiboken::listToArgcArgv(stringlist, &argc, &argv, "PySideApp")) {
  975. *cptr = new QCoreApplicationWrapper(argc, argv);
  976. Shiboken::Object::releaseOwnership(reinterpret_cast<SbkObject *>(self));
  977. PySide::registerCleanupFunction(&PySide::destroyQCoreApplication);
  978. }
  979. }
  980. // @snippet qcoreapplication-init
  981. // @snippet qcoreapplication-1
  982. QCoreApplicationConstructor(%PYSELF, args, &%0);
  983. // @snippet qcoreapplication-1
  984. // @snippet qcoreapplication-2
  985. PyObject *empty = PyTuple_New(2);
  986. if (!PyTuple_SetItem(empty, 0, PyList_New(0))) {
  987. QCoreApplicationConstructor(%PYSELF, empty, &%0);
  988. }
  989. // @snippet qcoreapplication-2
  990. // @snippet qcoreapplication-instance
  991. PyObject *pyApp = Py_None;
  992. if (qApp) {
  993. pyApp = reinterpret_cast<PyObject *>(
  994. Shiboken::BindingManager::instance().retrieveWrapper(qApp));
  995. if (!pyApp)
  996. pyApp = %CONVERTTOPYTHON[QCoreApplication *](qApp);
  997. // this will keep app live after python exit (extra ref)
  998. }
  999. // PYSIDE-571: make sure that we return the singleton "None"
  1000. if (Py_TYPE(pyApp) == Py_TYPE(Py_None))
  1001. Py_DECREF(MakeQAppWrapper(nullptr));
  1002. %PYARG_0 = pyApp;
  1003. Py_XINCREF(%PYARG_0);
  1004. // @snippet qcoreapplication-instance
  1005. // @snippet qdatastream-readrawdata
  1006. QByteArray data;
  1007. data.resize(%2);
  1008. int result = 0;
  1009. Py_BEGIN_ALLOW_THREADS
  1010. result = %CPPSELF.%FUNCTION_NAME(data.data(), data.size());
  1011. Py_END_ALLOW_THREADS
  1012. if (result == -1) {
  1013. Py_INCREF(Py_None);
  1014. %PYARG_0 = Py_None;
  1015. } else {
  1016. %PYARG_0 = PyBytes_FromStringAndSize(data.constData(), result);
  1017. }
  1018. // @snippet qdatastream-readrawdata
  1019. // @snippet qdatastream-writerawdata-pybuffer
  1020. int r = 0;
  1021. Py_ssize_t bufferLen;
  1022. auto *data = reinterpret_cast<const char*>(Shiboken::Buffer::getPointer(%PYARG_1, &bufferLen));
  1023. Py_BEGIN_ALLOW_THREADS
  1024. r = %CPPSELF.%FUNCTION_NAME(data, bufferLen);
  1025. Py_END_ALLOW_THREADS
  1026. %PYARG_0 = %CONVERTTOPYTHON[int](r);
  1027. // @snippet qdatastream-writerawdata-pybuffer
  1028. // @snippet qdatastream-writerawdata
  1029. int r = 0;
  1030. Py_BEGIN_ALLOW_THREADS
  1031. r = %CPPSELF.%FUNCTION_NAME(%1, Shiboken::String::len(%PYARG_1));
  1032. Py_END_ALLOW_THREADS
  1033. %PYARG_0 = %CONVERTTOPYTHON[int](r);
  1034. // @snippet qdatastream-writerawdata
  1035. // @snippet releaseownership
  1036. Shiboken::Object::releaseOwnership(%PYARG_0);
  1037. // @snippet releaseownership
  1038. // @snippet qanimationgroup-clear
  1039. for (int counter = 0, count = %CPPSELF.animationCount(); counter < count; ++counter ) {
  1040. QAbstractAnimation *animation = %CPPSELF.animationAt(counter);
  1041. PyObject *obj = %CONVERTTOPYTHON[QAbstractAnimation *](animation);
  1042. Shiboken::Object::setParent(nullptr, obj);
  1043. Py_DECREF(obj);
  1044. }
  1045. %CPPSELF.clear();
  1046. // @snippet qanimationgroup-clear
  1047. // @snippet qeasingcurve
  1048. PySideEasingCurveFunctor::init();
  1049. // @snippet qeasingcurve
  1050. // @snippet qeasingcurve-setcustomtype
  1051. QEasingCurve::EasingFunction func = PySideEasingCurveFunctor::createCustomFunction(%PYSELF, %PYARG_1);
  1052. if (func)
  1053. %CPPSELF.%FUNCTION_NAME(func);
  1054. // @snippet qeasingcurve-setcustomtype
  1055. // @snippet qeasingcurve-customtype
  1056. //%FUNCTION_NAME()
  1057. %PYARG_0 = PySideEasingCurveFunctor::callable(%PYSELF);
  1058. // @snippet qeasingcurve-customtype
  1059. // @snippet qt-signal
  1060. %PYARG_0 = Shiboken::String::fromFormat("2%s",QMetaObject::normalizedSignature(%1).constData());
  1061. // @snippet qt-signal
  1062. // @snippet qt-slot
  1063. %PYARG_0 = Shiboken::String::fromFormat("1%s",QMetaObject::normalizedSignature(%1).constData());
  1064. // @snippet qt-slot
  1065. // @snippet qt-registerresourcedata
  1066. QT_BEGIN_NAMESPACE
  1067. extern bool
  1068. qRegisterResourceData(int,
  1069. const unsigned char *,
  1070. const unsigned char *,
  1071. const unsigned char *);
  1072. extern bool
  1073. qUnregisterResourceData(int,
  1074. const unsigned char *,
  1075. const unsigned char *,
  1076. const unsigned char *);
  1077. QT_END_NAMESPACE
  1078. // @snippet qt-registerresourcedata
  1079. // @snippet qt-qregisterresourcedata
  1080. %RETURN_TYPE %0 = %FUNCTION_NAME(%1, reinterpret_cast<uchar *>(PyBytes_AsString(%PYARG_2)),
  1081. reinterpret_cast<uchar *>(PyBytes_AsString(%PYARG_3)),
  1082. reinterpret_cast<uchar *>(PyBytes_AsString(%PYARG_4)));
  1083. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  1084. // @snippet qt-qregisterresourcedata
  1085. // @snippet qt-qunregisterresourcedata
  1086. %RETURN_TYPE %0 = %FUNCTION_NAME(%1, reinterpret_cast<uchar *>(PyBytes_AsString(%PYARG_2)),
  1087. reinterpret_cast<uchar *>(PyBytes_AsString(%PYARG_3)),
  1088. reinterpret_cast<uchar *>(PyBytes_AsString(%PYARG_4)));
  1089. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  1090. // @snippet qt-qunregisterresourcedata
  1091. // @snippet qdebug-format-string
  1092. Py_BEGIN_ALLOW_THREADS
  1093. %FUNCTION_NAME("%s", %1); // Uses placeholder for security reasons
  1094. Py_END_ALLOW_THREADS
  1095. // @snippet qdebug-format-string
  1096. // @snippet qmessagelogger-format-string
  1097. Py_BEGIN_ALLOW_THREADS
  1098. %CPPSELF->%FUNCTION_NAME("%s", %1); // Uses placeholder for security reasons
  1099. Py_END_ALLOW_THREADS
  1100. // @snippet qmessagelogger-format-string
  1101. // @snippet qmessagelogger-logcategory-format-string
  1102. Py_BEGIN_ALLOW_THREADS
  1103. %CPPSELF->%FUNCTION_NAME(%1, "%s", %2); // Uses placeholder for security reasons
  1104. Py_END_ALLOW_THREADS
  1105. // @snippet qmessagelogger-logcategory-format-string
  1106. // @snippet qresource-registerResource
  1107. auto ptr = reinterpret_cast<uchar *>(Shiboken::Buffer::getPointer(%PYARG_1));
  1108. %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(const_cast<const uchar *>(ptr), %2);
  1109. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  1110. // @snippet qresource-registerResource
  1111. // @snippet qstring-return
  1112. %PYARG_0 = %CONVERTTOPYTHON[QString](%1);
  1113. // @snippet qstring-return
  1114. // @snippet stream-write-method
  1115. Py_BEGIN_ALLOW_THREADS
  1116. (*%CPPSELF) << %1;
  1117. Py_END_ALLOW_THREADS
  1118. // @snippet stream-write-method
  1119. // @snippet stream-read-method
  1120. %RETURN_TYPE _cpp_result;
  1121. Py_BEGIN_ALLOW_THREADS
  1122. (*%CPPSELF) >> _cpp_result;
  1123. Py_END_ALLOW_THREADS
  1124. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](_cpp_result);
  1125. // @snippet stream-read-method
  1126. // @snippet return-qstring-ref
  1127. QString &res = *%0;
  1128. %PYARG_0 = %CONVERTTOPYTHON[QString](res);
  1129. // @snippet return-qstring-ref
  1130. // @snippet return-readData
  1131. %RETURN_TYPE %0 = 0;
  1132. if (PyBytes_Check(%PYARG_0)) {
  1133. %0 = PyBytes_Size(%PYARG_0.object());
  1134. memcpy(%1, PyBytes_AsString(%PYARG_0.object()), %0);
  1135. } else if (Shiboken::String::check(%PYARG_0.object())) {
  1136. %0 = Shiboken::String::len(%PYARG_0.object());
  1137. memcpy(%1, Shiboken::String::toCString(%PYARG_0.object()), %0);
  1138. }
  1139. // @snippet return-readData
  1140. // @snippet qiodevice-readData
  1141. QByteArray ba(1 + qsizetype(%2), char(0));
  1142. Py_BEGIN_ALLOW_THREADS
  1143. %CPPSELF.%FUNCTION_NAME(ba.data(), qint64(%2));
  1144. Py_END_ALLOW_THREADS
  1145. %PYARG_0 = Shiboken::String::fromCString(ba.constData());
  1146. // @snippet qiodevice-readData
  1147. // @snippet qt-module-shutdown
  1148. { // Avoid name clash
  1149. Shiboken::AutoDecRef regFunc(static_cast<PyObject *>(nullptr));
  1150. Shiboken::AutoDecRef atexit(Shiboken::Module::import("atexit"));
  1151. if (atexit.isNull()) {
  1152. qWarning("Module atexit not found for registering __moduleShutdown");
  1153. PyErr_Clear();
  1154. } else {
  1155. regFunc.reset(PyObject_GetAttrString(atexit, "register"));
  1156. if (regFunc.isNull()) {
  1157. qWarning("Function atexit.register not found for registering __moduleShutdown");
  1158. PyErr_Clear();
  1159. }
  1160. }
  1161. if (!atexit.isNull() && !regFunc.isNull()){
  1162. PyObject *shutDownFunc = PyObject_GetAttrString(module, "__moduleShutdown");
  1163. Shiboken::AutoDecRef args(PyTuple_New(1));
  1164. PyTuple_SetItem(args, 0, shutDownFunc);
  1165. Shiboken::AutoDecRef retval(PyObject_Call(regFunc, args, nullptr));
  1166. Q_ASSERT(!retval.isNull());
  1167. }
  1168. }
  1169. // @snippet qt-module-shutdown
  1170. // @snippet qthread_init_pypy
  1171. #ifdef PYPY_VERSION
  1172. // PYSIDE-535: PyPy 7.3.8 needs this call, which is actually a no-op in Python 3.9
  1173. // This function should be replaced by a `Py_Initialize` call, but
  1174. // that is still undefined. So we don't rely yet on any PyPy version.
  1175. PyEval_InitThreads();
  1176. #endif
  1177. // @snippet qthread_init_pypy
  1178. // @snippet qthread_exec_
  1179. if (PyErr_WarnEx(PyExc_DeprecationWarning,
  1180. "'exec_' will be removed in the future. "
  1181. "Use 'exec' instead.",
  1182. 1)) {
  1183. return nullptr;
  1184. }
  1185. %BEGIN_ALLOW_THREADS
  1186. #ifndef AVOID_PROTECTED_HACK
  1187. int cppResult = %CPPSELF.exec();
  1188. #else
  1189. int cppResult = static_cast<::QThreadWrapper *>(cppSelf)->QThreadWrapper::exec_protected();
  1190. #endif
  1191. %END_ALLOW_THREADS
  1192. %PYARG_0 = %CONVERTTOPYTHON[int](cppResult);
  1193. // @snippet qthread_exec_
  1194. // @snippet exec_
  1195. if (PyErr_WarnEx(PyExc_DeprecationWarning,
  1196. "'exec_' will be removed in the future. "
  1197. "Use 'exec' instead.",
  1198. 1)) {
  1199. return nullptr;
  1200. }
  1201. %BEGIN_ALLOW_THREADS
  1202. int cppResult = %CPPSELF.exec();
  1203. %END_ALLOW_THREADS
  1204. %PYARG_0 = %CONVERTTOPYTHON[int](cppResult);
  1205. // @snippet exec_
  1206. // @snippet exec_arg1
  1207. if (PyErr_WarnEx(PyExc_DeprecationWarning,
  1208. "'exec_' will be removed in the future. "
  1209. "Use 'exec' instead.",
  1210. 1)) {
  1211. return nullptr;
  1212. }
  1213. %BEGIN_ALLOW_THREADS
  1214. int cppResult;
  1215. if (numArgs == 1)
  1216. cppResult = %CPPSELF.exec(%1);
  1217. else
  1218. cppResult = %CPPSELF.exec();
  1219. %END_ALLOW_THREADS
  1220. %PYARG_0 = %CONVERTTOPYTHON[int](cppResult);
  1221. // @snippet exec_arg1
  1222. // @snippet exec_arg1_noreturn
  1223. if (PyErr_WarnEx(PyExc_DeprecationWarning,
  1224. "'exec_' will be removed in the future. "
  1225. "Use 'exec' instead.",
  1226. 1)) {
  1227. return nullptr;
  1228. }
  1229. %BEGIN_ALLOW_THREADS
  1230. if (numArgs == 1)
  1231. %CPPSELF.exec(%1);
  1232. else
  1233. %CPPSELF.exec();
  1234. %END_ALLOW_THREADS
  1235. // @snippet exec_arg1_noreturn
  1236. // @snippet qtextstreammanipulator-exec
  1237. if (PyErr_WarnEx(PyExc_DeprecationWarning,
  1238. "'exec_' will be removed in the future. "
  1239. "Use 'exec' instead.",
  1240. 1)) {
  1241. return nullptr;
  1242. }
  1243. %CPPSELF.exec(%1);
  1244. // @snippet qtextstreammanipulator-exec
  1245. /*********************************************************************
  1246. * CONVERSIONS
  1247. ********************************************************************/
  1248. // @snippet conversion-pybool
  1249. %out = %OUTTYPE(%in == Py_True);
  1250. // @snippet conversion-pybool
  1251. // @snippet conversion-pylong-quintptr
  1252. #if QT_POINTER_SIZE == 8
  1253. %out = %OUTTYPE(PyLong_AsUnsignedLongLong(%in));
  1254. #else
  1255. %out = %OUTTYPE(PyLong_AsUnsignedLong(%in));
  1256. #endif
  1257. // @snippet conversion-pylong-quintptr
  1258. // @snippet conversion-pyunicode
  1259. %out = PySide::pyUnicodeToQString(%in);
  1260. // @snippet conversion-pyunicode
  1261. // @snippet conversion-pynone
  1262. SBK_UNUSED(%in)
  1263. %out = %OUTTYPE();
  1264. // @snippet conversion-pynone
  1265. // @snippet qfile-path-1
  1266. auto cppArg0 = PySide::pyPathToQString(%PYARG_1);
  1267. // @snippet qfile-path-1
  1268. // @snippet qfile-path-2
  1269. auto cppArg1 = PySide::pyPathToQString(%PYARG_2);
  1270. // @snippet qfile-path-2
  1271. // @snippet qitemselection-add
  1272. auto res = (*%CPPSELF) + cppArg0;
  1273. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](res);
  1274. // @snippet qitemselection-add
  1275. // @snippet conversion-pystring-char
  1276. char c = %CONVERTTOCPP[char](%in);
  1277. %out = %OUTTYPE(static_cast<unsigned short>(c));
  1278. // @snippet conversion-pystring-char
  1279. // @snippet conversion-pyint
  1280. int i = %CONVERTTOCPP[int](%in);
  1281. %out = %OUTTYPE(i);
  1282. // @snippet conversion-pyint
  1283. // @snippet conversion-qlonglong
  1284. // PYSIDE-1250: For QVariant, if the type fits into an int; use int preferably.
  1285. qlonglong in = %CONVERTTOCPP[qlonglong](%in);
  1286. constexpr qlonglong intMax = qint64(std::numeric_limits<int>::max());
  1287. constexpr qlonglong intMin = qint64(std::numeric_limits<int>::min());
  1288. %out = in >= intMin && in <= intMax ? %OUTTYPE(int(in)) : %OUTTYPE(in);
  1289. // @snippet conversion-qlonglong
  1290. // @snippet conversion-qstring
  1291. QString in = %CONVERTTOCPP[QString](%in);
  1292. %out = %OUTTYPE(in);
  1293. // @snippet conversion-qstring
  1294. // @snippet conversion-qbytearray
  1295. QByteArray in = %CONVERTTOCPP[QByteArray](%in);
  1296. %out = %OUTTYPE(in);
  1297. // @snippet conversion-qbytearray
  1298. // @snippet conversion-pyfloat
  1299. double in = %CONVERTTOCPP[double](%in);
  1300. %out = %OUTTYPE(in);
  1301. // @snippet conversion-pyfloat
  1302. // @snippet conversion-sbkobject
  1303. // a class supported by QVariant?
  1304. QMetaType metaType;
  1305. if (Shiboken::Enum::check(%in)) {
  1306. const auto typeName = PySide::QEnum::getTypeName(Py_TYPE(%in));
  1307. if (!typeName.isEmpty())
  1308. metaType = QMetaType::fromName(typeName);
  1309. }
  1310. if (!metaType.isValid())
  1311. metaType = PySide::Variant::resolveMetaType(Py_TYPE(%in));
  1312. bool ok = false;
  1313. if (metaType.isValid()) {
  1314. QVariant var(metaType);
  1315. auto converterO = converterForQtType(metaType.name());
  1316. ok = converterO.has_value();
  1317. if (ok) {
  1318. converterO.value().toCpp(pyIn, var.data());
  1319. %out = var;
  1320. } else {
  1321. qWarning("%s: Cannot find a converter for \"%s\".",
  1322. __FUNCTION__, metaType.name());
  1323. }
  1324. }
  1325. // If the type was not encountered, return a default PyObjectWrapper
  1326. if (!ok)
  1327. %out = QVariant::fromValue(PySide::PyObjectWrapper(%in));
  1328. // @snippet conversion-sbkobject
  1329. // @snippet conversion-pydict
  1330. QVariant ret = PySide::Variant::convertToVariantMap(%in);
  1331. %out = ret.isValid() ? ret : QVariant::fromValue(PySide::PyObjectWrapper(%in));
  1332. // @snippet conversion-pydict
  1333. // @snippet conversion-pylist
  1334. QVariant ret = PySide::Variant::convertToVariantList(%in);
  1335. %out = ret.isValid() ? ret : QVariant::fromValue(PySide::PyObjectWrapper(%in));
  1336. // @snippet conversion-pylist
  1337. // @snippet conversion-pyobject
  1338. // Is a shiboken type not known by Qt
  1339. %out = QVariant::fromValue(PySide::PyObjectWrapper(%in));
  1340. // @snippet conversion-pyobject
  1341. // @snippet conversion-qjsonobject-pydict
  1342. QVariant dict = PySide::Variant::convertToVariantMap(%in);
  1343. QJsonValue val = QJsonValue::fromVariant(dict);
  1344. %out = val.toObject();
  1345. // @snippet conversion-qjsonobject-pydict
  1346. // @snippet conversion-qdate-pydate
  1347. int day = PyDateTime_GET_DAY(%in);
  1348. int month = PyDateTime_GET_MONTH(%in);
  1349. int year = PyDateTime_GET_YEAR(%in);
  1350. %out = %OUTTYPE(year, month, day);
  1351. // @snippet conversion-qdate-pydate
  1352. // @snippet conversion-qdatetime-pydatetime
  1353. int day = PyDateTime_GET_DAY(%in);
  1354. int month = PyDateTime_GET_MONTH(%in);
  1355. int year = PyDateTime_GET_YEAR(%in);
  1356. int hour = PyDateTime_DATE_GET_HOUR(%in);
  1357. int min = PyDateTime_DATE_GET_MINUTE(%in);
  1358. int sec = PyDateTime_DATE_GET_SECOND(%in);
  1359. int usec = PyDateTime_DATE_GET_MICROSECOND(%in);
  1360. %out = %OUTTYPE(QDate(year, month, day), QTime(hour, min, sec, usec/1000));
  1361. // @snippet conversion-qdatetime-pydatetime
  1362. // @snippet conversion-qtime-pytime
  1363. int hour = PyDateTime_TIME_GET_HOUR(%in);
  1364. int min = PyDateTime_TIME_GET_MINUTE(%in);
  1365. int sec = PyDateTime_TIME_GET_SECOND(%in);
  1366. int usec = PyDateTime_TIME_GET_MICROSECOND(%in);
  1367. %out = %OUTTYPE(hour, min, sec, usec/1000);
  1368. // @snippet conversion-qtime-pytime
  1369. // @snippet conversion-qbytearray-pybytes
  1370. %out = %OUTTYPE(PyBytes_AsString(%in), PyBytes_Size(%in));
  1371. // @snippet conversion-qbytearray-pybytes
  1372. // @snippet conversion-qbytearray-pybytearray
  1373. %out = %OUTTYPE(PyByteArray_AsString(%in), PyByteArray_Size(%in));
  1374. // @snippet conversion-qbytearray-pybytearray
  1375. // @snippet conversion-qbytearray-pystring
  1376. %out = %OUTTYPE(Shiboken::String::toCString(%in), Shiboken::String::len(%in));
  1377. // @snippet conversion-qbytearray-pystring
  1378. /*********************************************************************
  1379. * NATIVE TO TARGET CONVERSIONS
  1380. ********************************************************************/
  1381. // @snippet return-pybool
  1382. return PyBool_FromLong((bool)%in);
  1383. // @snippet return-pybool
  1384. // @snippet return-pybytes
  1385. return PyBytes_FromStringAndSize(%in.constData(), %in.size());
  1386. // @snippet return-pybytes
  1387. // @snippet chrono-to-pylong
  1388. return PyLong_FromLong(%in.count());
  1389. // @snippet chrono-to-pylong
  1390. // @snippet pylong-to-chrono
  1391. %out = %OUTTYPE(PyLong_AsLongLong(%in));
  1392. // @snippet pylong-to-chrono
  1393. // @snippet return-pylong
  1394. return PyLong_FromLong(%in);
  1395. // @snippet return-pylong
  1396. // @snippet return-pylong-quintptr
  1397. #if QT_POINTER_SIZE == 8
  1398. return PyLong_FromUnsignedLongLong(%in);
  1399. #else
  1400. return PyLong_FromUnsignedLong(%in);
  1401. #endif
  1402. // @snippet return-pylong-quintptr
  1403. // @snippet return-qfunctionpointer-pylong
  1404. return PyLong_FromVoidPtr(reinterpret_cast<void *>(%in));
  1405. // @snippet return-qfunctionpointer-pylong
  1406. // @snippet conversion-pylong-qfunctionpointer
  1407. %out = reinterpret_cast<QFunctionPointer>(PyLong_AsVoidPtr(%in));
  1408. // @snippet conversion-pylong-qfunctionpointer
  1409. // @snippet return-pyunicode
  1410. return PySide::qStringToPyUnicode(%in);
  1411. // @snippet return-pyunicode
  1412. // @snippet return-pyunicode-from-qlatin1string
  1413. #ifdef Py_LIMITED_API
  1414. return PySide::qStringToPyUnicode(QString::fromLatin1(%in));
  1415. #else
  1416. return PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, %in.constData(), %in.size());
  1417. #endif
  1418. // @snippet return-pyunicode-from-qlatin1string
  1419. // @snippet qlatin1string-check
  1420. static bool qLatin1StringCheck(PyObject *o)
  1421. {
  1422. return PyUnicode_CheckExact(o) != 0
  1423. && _PepUnicode_KIND(o) == PepUnicode_1BYTE_KIND;
  1424. }
  1425. // @snippet qlatin1string-check
  1426. // @snippet conversion-pystring-qlatin1string
  1427. const char *data = reinterpret_cast<const char *>(_PepUnicode_DATA(%in));
  1428. const Py_ssize_t len = PyUnicode_GetLength(%in);
  1429. %out = QLatin1String(data, len);
  1430. // @snippet conversion-pystring-qlatin1string
  1431. // @snippet return-pyunicode-from-qanystringview
  1432. return PySide::qStringToPyUnicode(%in.toString());
  1433. // @snippet return-pyunicode-from-qanystringview
  1434. // @snippet return-pyunicode-qchar
  1435. auto c = wchar_t(%in.unicode());
  1436. return PyUnicode_FromWideChar(&c, 1);
  1437. // @snippet return-pyunicode-qchar
  1438. // @snippet return-qvariant
  1439. if (!%in.isValid())
  1440. Py_RETURN_NONE;
  1441. switch (%in.typeId()) {
  1442. case QMetaType::UnknownType:
  1443. case QMetaType::Nullptr:
  1444. Py_RETURN_NONE;
  1445. case QMetaType::VoidStar:
  1446. if (%in.constData() == nullptr)
  1447. Py_RETURN_NONE;
  1448. break;
  1449. case QMetaType::QVariantList: {
  1450. const auto var = %in.value<QVariantList>();
  1451. return %CONVERTTOPYTHON[QList<QVariant>](var);
  1452. }
  1453. case QMetaType::QStringList: {
  1454. const auto var = %in.value<QStringList>();
  1455. return %CONVERTTOPYTHON[QList<QString>](var);
  1456. }
  1457. case QMetaType::QVariantMap: {
  1458. const auto var = %in.value<QVariantMap>();
  1459. return %CONVERTTOPYTHON[QMap<QString, QVariant>](var);
  1460. }
  1461. default:
  1462. break;
  1463. }
  1464. auto converterO = converterForQtType(cppInRef.typeName());
  1465. if (converterO.has_value())
  1466. return converterO.value().toPython(cppInRef.data());
  1467. PyErr_Format(PyExc_RuntimeError, "Can't find converter for '%s'.", %in.typeName());
  1468. return nullptr;
  1469. // @snippet return-qvariant
  1470. // @snippet return-qjsonobject
  1471. // The QVariantMap returned by QJsonObject seems to cause a segfault, so
  1472. // using QJsonObject.toVariantMap() won't work.
  1473. // Wrapping it in a QJsonValue first allows it to work
  1474. QJsonValue val(%in);
  1475. QVariant ret = val.toVariant();
  1476. return %CONVERTTOPYTHON[QVariant](ret);
  1477. // @snippet return-qjsonobject
  1478. // @snippet qthread_pthread_cleanup
  1479. #ifdef Q_OS_UNIX
  1480. # include <pthread.h>
  1481. static void qthread_pthread_cleanup(void *arg)
  1482. {
  1483. // PYSIDE 1282: When terminating a thread using QThread::terminate()
  1484. // (pthread_cancel()), QThread::run() is aborted and the lock is released,
  1485. // but ~GilState() is still executed for some reason. Prevent it from
  1486. // releasing.
  1487. auto gil = reinterpret_cast<Shiboken::GilState *>(arg);
  1488. gil->abandon();
  1489. }
  1490. #endif // Q_OS_UNIX
  1491. // @snippet qthread_pthread_cleanup
  1492. // @snippet qthread_pthread_cleanup_install
  1493. #ifdef Q_OS_UNIX
  1494. pthread_cleanup_push(qthread_pthread_cleanup, &gil);
  1495. #endif
  1496. // @snippet qthread_pthread_cleanup_install
  1497. // @snippet qthread_pthread_cleanup_uninstall
  1498. #ifdef Q_OS_UNIX
  1499. pthread_cleanup_pop(0);
  1500. #endif
  1501. // @snippet qthread_pthread_cleanup_uninstall
  1502. // @snippet qlibraryinfo_python_build
  1503. // For versions with one byte per digit.
  1504. static QByteArray versionString(long version)
  1505. {
  1506. return QByteArray::number((version >> 16) & 0xFF)
  1507. + '.' + QByteArray::number((version >> 8) & 0xFF)
  1508. + '.' + QByteArray::number(version & 0xFF);
  1509. }
  1510. static QByteArray pythonBuild()
  1511. {
  1512. using namespace Qt::StringLiterals;
  1513. #ifdef PYPY_VERSION
  1514. QByteArray result = "PyPy " PYPY_VERSION
  1515. #else
  1516. QByteArray result = "Python"
  1517. #endif
  1518. #ifdef Py_LIMITED_API
  1519. " limited API"
  1520. #endif
  1521. #ifdef Py_GIL_DISABLED
  1522. " free threaded"
  1523. #endif
  1524. ;
  1525. result += ' ';
  1526. const auto runTimeVersion = _PepRuntimeVersion();
  1527. const auto runTimeVersionB = versionString(runTimeVersion);
  1528. constexpr long buildVersion = PY_VERSION_HEX >> 8;
  1529. if (runTimeVersion == buildVersion) {
  1530. result += runTimeVersionB;
  1531. } else {
  1532. result += "run time: "_ba + runTimeVersionB + " built: "_ba
  1533. + versionString(buildVersion);
  1534. }
  1535. return result;
  1536. }
  1537. // @snippet qlibraryinfo_python_build
  1538. // @snippet qlibraryinfo_build
  1539. QByteArray %0 = %CPPSELF.%FUNCTION_NAME();
  1540. %0 += " [" + pythonBuild() + ']';
  1541. %PYARG_0 = PyUnicode_FromString(%0.constData());
  1542. // @snippet qlibraryinfo_build
  1543. // @snippet qsharedmemory_data_readonly
  1544. %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(), %CPPSELF.size());
  1545. // @snippet qsharedmemory_data_readonly
  1546. // @snippet qsharedmemory_data_readwrite
  1547. // FIXME: There is no way to tell whether QSharedMemory was attached read/write
  1548. %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(), %CPPSELF.size(),
  1549. Shiboken::Buffer::ReadWrite);
  1550. // @snippet qsharedmemory_data_readwrite
  1551. // @snippet std-function-void-lambda
  1552. auto *callable = %PYARG_1;
  1553. auto cppCallback = [callable]()
  1554. {
  1555. Shiboken::GilState state;
  1556. Shiboken::AutoDecRef arglist(PyTuple_New(0));
  1557. Shiboken::AutoDecRef ret(PyObject_CallObject(callable, arglist));
  1558. Py_DECREF(callable);
  1559. };
  1560. // @snippet std-function-void-lambda
  1561. // @snippet qthreadpool-start
  1562. Py_INCREF(callable);
  1563. %CPPSELF.%FUNCTION_NAME(cppCallback, %2);
  1564. // @snippet qthreadpool-start
  1565. // @snippet qthreadpool-trystart
  1566. Py_INCREF(callable);
  1567. %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(cppCallback);
  1568. %PYARG_0 = %CONVERTTOPYTHON[int](cppResult);
  1569. // @snippet qthreadpool-trystart
  1570. // @snippet repr-qevent
  1571. QString result;
  1572. QDebug(&result).nospace() << "<PySide6.QtCore.QEvent(" << %CPPSELF->type() << ")>";
  1573. %PYARG_0 = Shiboken::String::fromCString(qPrintable(result));
  1574. // @snippet repr-qevent
  1575. // @snippet qmetaproperty_write_enum
  1576. if (Shiboken::Enum::check(%PYARG_2))
  1577. cppArg1 = QVariant(int(Shiboken::Enum::getValue(%PYARG_2)));
  1578. // @snippet qmetaproperty_write_enum
  1579. // @snippet qmetaenum_value
  1580. auto valueOpt = %CPPSELF.value64(%1);
  1581. if (valueOpt.has_value()) {
  1582. const quint64 ullValue = valueOpt.value();
  1583. %PYARG_0 = PyLong_FromUnsignedLongLong(ullValue);
  1584. } else {
  1585. const int lValue = %CPPSELF.%FUNCTION_NAME(%1);
  1586. %PYARG_0 = PyLong_FromLong(lValue);
  1587. }
  1588. // @snippet qmetaenum_value
  1589. // @snippet qmetaenum_keytovalue
  1590. PyObject *pyLongValue{};
  1591. auto valueOpt = %CPPSELF.keyToValue64(%1);
  1592. bool ok_ = valueOpt.has_value();
  1593. if (ok_)
  1594. pyLongValue = PyLong_FromUnsignedLongLong(valueOpt.value());
  1595. else
  1596. pyLongValue = PyLong_FromLong(%CPPSELF.%FUNCTION_NAME(%1, &ok_));
  1597. %PYARG_0 = PyTuple_New(2);
  1598. PyTuple_SetItem(%PYARG_0, 0, pyLongValue);
  1599. PyTuple_SetItem(%PYARG_0, 1, %CONVERTTOPYTHON[bool](ok_));
  1600. // @snippet qmetaenum_keytovalue
  1601. // @snippet qmetaenum_keystovalue
  1602. PyObject *pyLongValue{};
  1603. auto valueOpt = %CPPSELF.keysToValue64(%1);
  1604. bool ok_ = valueOpt.has_value();
  1605. if (ok_)
  1606. pyLongValue = PyLong_FromUnsignedLongLong(valueOpt.value());
  1607. else
  1608. pyLongValue = PyLong_FromLong(%CPPSELF.%FUNCTION_NAME(%1, &ok_));
  1609. %PYARG_0 = PyTuple_New(2);
  1610. PyTuple_SetItem(%PYARG_0, 0, pyLongValue);
  1611. PyTuple_SetItem(%PYARG_0, 1, %CONVERTTOPYTHON[bool](ok_));
  1612. // @snippet qmetaenum_keystovalue
  1613. // @snippet qdatastream-read-bytes
  1614. QByteArray data;
  1615. data.resize(%2);
  1616. auto dataChar = data.data();
  1617. cppSelf->readBytes(dataChar, %2);
  1618. const char *constDataChar = dataChar;
  1619. if (dataChar == nullptr) {
  1620. Py_INCREF(Py_None);
  1621. %PYARG_0 = Py_None;
  1622. } else {
  1623. %PYARG_0 = PyBytes_FromStringAndSize(constDataChar, %2);
  1624. }
  1625. // @snippet qdatastream-read-bytes
  1626. // Q_ARG()-equivalent
  1627. // @snippet q_arg
  1628. const QArgData qArgData = qArgDataFromPyType(%1);
  1629. if (!qArgData)
  1630. return nullptr;
  1631. switch (qArgData.metaType.id()) {
  1632. case QMetaType::Bool:
  1633. *reinterpret_cast<bool *>(qArgData.data) = %2 == Py_True;
  1634. break;
  1635. case QMetaType::Int:
  1636. *reinterpret_cast<int *>(qArgData.data) = int(PyLong_AsLong(%2));
  1637. break;
  1638. case QMetaType::Double:
  1639. *reinterpret_cast<double *>(qArgData.data) = PyFloat_AsDouble(%2);
  1640. break;
  1641. case QMetaType::QString:
  1642. *reinterpret_cast<QString *>(qArgData.data) = PySide::pyUnicodeToQString(%2);
  1643. break;
  1644. default: {
  1645. Shiboken::Conversions::SpecificConverter converter(qArgData.metaType.name());
  1646. const auto type = converter.conversionType();
  1647. // Copy for values, Pointer for objects
  1648. if (type == Shiboken::Conversions::SpecificConverter::InvalidConversion) {
  1649. PyErr_Format(PyExc_RuntimeError, "%s: Unable to find converter for \"%s\".",
  1650. __FUNCTION__, qArgData.metaType.name());
  1651. return nullptr;
  1652. }
  1653. converter.toCpp(%2, qArgData.data);
  1654. }
  1655. }
  1656. QtCoreHelper::QGenericArgumentHolder result(qArgData.metaType, qArgData.data);
  1657. %PYARG_0 = %CONVERTTOPYTHON[QtCoreHelper::QGenericArgumentHolder](result);
  1658. // @snippet q_arg
  1659. // Q_RETURN_ARG()-equivalent
  1660. // @snippet q_return_arg
  1661. const QArgData qArgData = qArgDataFromPyType(%1);
  1662. if (!qArgData)
  1663. return nullptr;
  1664. QtCoreHelper::QGenericReturnArgumentHolder result(qArgData.metaType, qArgData.data);
  1665. %PYARG_0 = %CONVERTTOPYTHON[QtCoreHelper::QGenericReturnArgumentHolder](result);
  1666. // @snippet q_return_arg
  1667. // @snippet qmetamethod-invoke-helpers
  1668. static InvokeMetaMethodFunc
  1669. createInvokeMetaMethodFunc(const QMetaMethod &method, QObject *object,
  1670. Qt::ConnectionType type = Qt::AutoConnection)
  1671. {
  1672. return [&method, object, type](QGenericArgument a0, QGenericArgument a1,
  1673. QGenericArgument a2, QGenericArgument a3,
  1674. QGenericArgument a4, QGenericArgument a5,
  1675. QGenericArgument a6, QGenericArgument a7,
  1676. QGenericArgument a8, QGenericArgument a9) -> bool
  1677. {
  1678. return method.invoke(object, type, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
  1679. };
  1680. }
  1681. static InvokeMetaMethodFuncWithReturn
  1682. createInvokeMetaMethodFuncWithReturn(const QMetaMethod &method, QObject *object,
  1683. Qt::ConnectionType type = Qt::AutoConnection)
  1684. {
  1685. return [&method, object, type](QGenericReturnArgument r,
  1686. QGenericArgument a0, QGenericArgument a1,
  1687. QGenericArgument a2, QGenericArgument a3,
  1688. QGenericArgument a4, QGenericArgument a5,
  1689. QGenericArgument a6, QGenericArgument a7,
  1690. QGenericArgument a8, QGenericArgument a9) -> bool
  1691. {
  1692. return method.invoke(object, type, r, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
  1693. };
  1694. }
  1695. // @snippet qmetamethod-invoke-helpers
  1696. // @snippet qmetamethod-invoke-conn-type-return-arg
  1697. %PYARG_0 = invokeMetaMethodWithReturn(createInvokeMetaMethodFuncWithReturn(*%CPPSELF, %1, %2),
  1698. %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13);
  1699. // @snippet qmetamethod-invoke-conn-type-return-arg
  1700. // @snippet qmetamethod-invoke-return-arg
  1701. %PYARG_0 = invokeMetaMethodWithReturn(createInvokeMetaMethodFuncWithReturn(*%CPPSELF, %1),
  1702. %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12);
  1703. // @snippet qmetamethod-invoke-return-arg
  1704. // @snippet qmetamethod-invoke-conn-type
  1705. %PYARG_0 = invokeMetaMethod(createInvokeMetaMethodFunc(*%CPPSELF, %1, %2),
  1706. %3, %4, %5, %6, %7, %8, %9, %10, %11, %12);
  1707. // @snippet qmetamethod-invoke-conn-type
  1708. // @snippet qmetamethod-invoke
  1709. %PYARG_0 = invokeMetaMethod(createInvokeMetaMethodFunc(*%CPPSELF, %1),
  1710. %2, %3, %4, %5, %6, %7, %8, %9, %10, %11);
  1711. // @snippet qmetamethod-invoke
  1712. // @snippet qmetaobject-invokemethod-helpers
  1713. static InvokeMetaMethodFunc
  1714. createInvokeMetaMethodFunc(QObject *object, const char *methodName,
  1715. Qt::ConnectionType type = Qt::AutoConnection)
  1716. {
  1717. return [object, methodName, type](QGenericArgument a0, QGenericArgument a1,
  1718. QGenericArgument a2, QGenericArgument a3,
  1719. QGenericArgument a4, QGenericArgument a5,
  1720. QGenericArgument a6, QGenericArgument a7,
  1721. QGenericArgument a8, QGenericArgument a9) -> bool
  1722. {
  1723. return QMetaObject::invokeMethod(object, methodName, type,
  1724. a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
  1725. };
  1726. }
  1727. static InvokeMetaMethodFuncWithReturn
  1728. createInvokeMetaMethodFuncWithReturn(QObject *object, const char *methodName,
  1729. Qt::ConnectionType type = Qt::AutoConnection)
  1730. {
  1731. return [object, methodName, type](QGenericReturnArgument r,
  1732. QGenericArgument a0, QGenericArgument a1,
  1733. QGenericArgument a2, QGenericArgument a3,
  1734. QGenericArgument a4, QGenericArgument a5,
  1735. QGenericArgument a6, QGenericArgument a7,
  1736. QGenericArgument a8, QGenericArgument a9) -> bool
  1737. {
  1738. return QMetaObject::invokeMethod(object, methodName, type,
  1739. r, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
  1740. };
  1741. }
  1742. // @snippet qmetaobject-invokemethod-helpers
  1743. // invokeMethod(QObject *,const char *, QGenericArgument a0, a1, a2 )
  1744. // @snippet qmetaobject-invokemethod-arg
  1745. %PYARG_0 = invokeMetaMethod(createInvokeMetaMethodFunc(%1, %2),
  1746. %3, %4, %5, %6, %7, %8, %9, %10, %11, %12);
  1747. // @snippet qmetaobject-invokemethod-arg
  1748. // invokeMethod(QObject *,const char *,Qt::ConnectionType, QGenericArgument a0, a1, a2 )
  1749. // @snippet qmetaobject-invokemethod-conn-type-arg
  1750. %PYARG_0 = invokeMetaMethod(createInvokeMetaMethodFunc(%1, %2, %3),
  1751. %4, %5, %6, %7, %8, %9, %10, %11, %12, %13);
  1752. // @snippet qmetaobject-invokemethod-conn-type-arg
  1753. // invokeMethod(QObject *,const char *, Qt::ConnectionType, QGenericReturnArgument,QGenericArgument a0, a1, a2 )
  1754. // @snippet qmetaobject-invokemethod-conn-type-return-arg
  1755. %PYARG_0 = invokeMetaMethodWithReturn(createInvokeMetaMethodFuncWithReturn(%1, %2, %3),
  1756. %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14);
  1757. // @snippet qmetaobject-invokemethod-conn-type-return-arg
  1758. // invokeMethod(QObject *,const char *, QGenericReturnArgument,QGenericArgument a0, a1, a2 )
  1759. // @snippet qmetaobject-invokemethod-return-arg
  1760. %PYARG_0 = invokeMetaMethodWithReturn(createInvokeMetaMethodFuncWithReturn(%1, %2),
  1761. %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13);
  1762. // @snippet qmetaobject-invokemethod-return-arg
  1763. // @snippet keycombination-from-keycombination
  1764. cptr = new ::%TYPE(%1);
  1765. // @snippet keycombination-from-keycombination
  1766. // @snippet keycombination-from-modifier
  1767. cptr = new ::%TYPE(%1, %2);
  1768. // @snippet keycombination-from-modifier
  1769. // @snippet qmetamethod-from-signal
  1770. auto *signalInst = reinterpret_cast<PySideSignalInstance *>(%PYARG_1);
  1771. const auto data = PySide::Signal::getEmitterData(signalInst);
  1772. const auto result = data.methodIndex != -1
  1773. ? data.emitter->metaObject()->method(data.methodIndex)
  1774. : QMetaMethod{};
  1775. %PYARG_0 = %CONVERTTOPYTHON[QMetaMethod](result);
  1776. // @snippet qmetamethod-from-signal
  1777. // @snippet qrunnable_create
  1778. auto callable = %PYARG_1;
  1779. auto callback = [callable]() -> void
  1780. {
  1781. if (!PyCallable_Check(callable)) {
  1782. qWarning("Argument 1 of %FUNCTION_NAME must be a callable.");
  1783. return;
  1784. }
  1785. Shiboken::GilState state;
  1786. Shiboken::AutoDecRef ret(PyObject_CallObject(callable, nullptr));
  1787. Py_DECREF(callable);
  1788. };
  1789. Py_INCREF(callable);
  1790. %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(callback);
  1791. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  1792. // @snippet qrunnable_create
  1793. // @snippet qlocale_system
  1794. // For darwin systems, QLocale::system() involves looking at the Info.plist of the application
  1795. // bundle to detect the system localization. In the case of Qt for Python, the application bundle
  1796. // is the used Python framework. To enable retreival of localized string, the property list key
  1797. // CFBunldeAllowMixedLocalizations should be set to True inside the Info.plist file. Otherwise,
  1798. // CFBundleDevelopmentRegion will be used to find the language preference of the user, which in the
  1799. // case of Python is always english.
  1800. // This is a hack until CFBunldeAllowMixedLocalizations will be set in the Python framework
  1801. // installation in darwin systems.
  1802. // Upstream issue in CPython: https://github.com/python/cpython/issues/108269
  1803. #ifdef Q_OS_DARWIN
  1804. Shiboken::AutoDecRef locale(PyImport_ImportModule("locale"));
  1805. Shiboken::AutoDecRef getLocale(PyObject_GetAttrString(locale, "getlocale"));
  1806. Shiboken::AutoDecRef systemLocale(PyObject_CallObject(getLocale, nullptr));
  1807. PyObject* localeCode = PyTuple_GetItem(systemLocale, 0);
  1808. %RETURN_TYPE %0;
  1809. if (localeCode != Py_None) {
  1810. QString localeCodeStr = PySide::pyStringToQString(localeCode);
  1811. %0 = QLocale(localeCodeStr);
  1812. } else {
  1813. // The default locale is 'C' locale as mentioned in
  1814. // https://docs.python.org/3/library/locale.html
  1815. %0 = ::QLocale::c();
  1816. }
  1817. #else
  1818. %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME();
  1819. #endif
  1820. %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
  1821. // @snippet qlocale_system
  1822. // @snippet qcoreapplication-requestpermission
  1823. auto permission = %1;
  1824. auto callable = %PYARG_3;
  1825. // check if callable
  1826. if (!PyCallable_Check(callable)) {
  1827. qWarning("Functor of %FUNCTION_NAME is not a callable");
  1828. return {};
  1829. }
  1830. // find the number of arguments of callable. It should either be empy or accept a QPermission
  1831. // object
  1832. int count = 0;
  1833. PyObject* fc = nullptr;
  1834. bool classMethod = false;
  1835. Shiboken::AutoDecRef func_ob(PyObject_GetAttr(callable, Shiboken::PyMagicName::func()));
  1836. if (func_ob.isNull() && PyObject_HasAttr(callable, Shiboken::PyMagicName::code())) {
  1837. // variable `callable` is a function
  1838. fc = PyObject_GetAttr(callable, Shiboken::PyMagicName::code());
  1839. } else {
  1840. // variable `callable` is a class method
  1841. fc = PyObject_GetAttr(func_ob, Shiboken::PyMagicName::code());
  1842. classMethod = true;
  1843. }
  1844. if (fc) {
  1845. PyObject* ac = PyObject_GetAttrString(fc, "co_argcount");
  1846. if (ac) {
  1847. count = PyLong_AsLong(ac);
  1848. Py_DECREF(ac);
  1849. }
  1850. Py_DECREF(fc);
  1851. }
  1852. if ((classMethod && (count > 2)) || (!classMethod && (count > 1))) {
  1853. qWarning("Functor of %FUNCTION_NAME must either have QPermission object as argument or none."
  1854. "The QPermission object store the result of requestPermission()");
  1855. return {};
  1856. }
  1857. bool arg_qpermission = (classMethod && (count == 2)) || (!classMethod && (count == 1));
  1858. auto callback = [callable, arg_qpermission](const QPermission &permission) -> void
  1859. {
  1860. Shiboken::GilState state;
  1861. if (arg_qpermission) {
  1862. Shiboken::AutoDecRef arglist(PyTuple_New(1));
  1863. PyTuple_SetItem(arglist.object(), 0, %CONVERTTOPYTHON[QPermission](permission));
  1864. Shiboken::AutoDecRef ret(PyObject_CallObject(callable, arglist));
  1865. } else {
  1866. Shiboken::AutoDecRef ret(PyObject_CallObject(callable, nullptr));
  1867. }
  1868. Py_DECREF(callable);
  1869. };
  1870. Py_INCREF(callable);
  1871. Py_BEGIN_ALLOW_THREADS
  1872. %CPPSELF.%FUNCTION_NAME(permission, %2, callback);
  1873. Py_END_ALLOW_THREADS
  1874. // @snippet qcoreapplication-requestpermission
  1875. // @snippet qlockfile-getlockinfo
  1876. qint64 pid{};
  1877. QString hostname, appname;
  1878. %CPPSELF.%FUNCTION_NAME(&pid, &hostname, &appname);
  1879. %PYARG_0 = PyTuple_New(3);
  1880. PyTuple_SetItem(%PYARG_0, 0, %CONVERTTOPYTHON[qint64](pid));
  1881. PyTuple_SetItem(%PYARG_0, 1, %CONVERTTOPYTHON[QString](hostname));
  1882. PyTuple_SetItem(%PYARG_0, 2, %CONVERTTOPYTHON[QString](appname));
  1883. // @snippet qlockfile-getlockinfo
  1884. // @snippet darwin_permission_plugin
  1885. #ifdef Q_OS_DARWIN
  1886. #include<QtCore/qplugin.h>
  1887. // register the static plugin and setup its metadata
  1888. Q_IMPORT_PLUGIN(QDarwinCameraPermissionPlugin)
  1889. Q_IMPORT_PLUGIN(QDarwinMicrophonePermissionPlugin)
  1890. Q_IMPORT_PLUGIN(QDarwinBluetoothPermissionPlugin)
  1891. Q_IMPORT_PLUGIN(QDarwinContactsPermissionPlugin)
  1892. Q_IMPORT_PLUGIN(QDarwinCalendarPermissionPlugin)
  1893. #endif
  1894. // @snippet darwin_permission_plugin
  1895. // @snippet qt-modifier
  1896. PyObject *_inputDict = PyDict_New();
  1897. // Note: The builtins line is no longer needed since Python 3.10. Undocumented!
  1898. Shiboken::AutoDecRef builtins(PepEval_GetFrameBuiltins());
  1899. PyDict_SetItemString(_inputDict, "__builtins__", builtins.object());
  1900. builtins.reset(nullptr);
  1901. PyDict_SetItemString(_inputDict, "QtCore", module);
  1902. PyDict_SetItemString(_inputDict, "Qt", reinterpret_cast<PyObject *>(pyType));
  1903. // Explicitly not dereferencing the result.
  1904. PyRun_String(R"PY(if True:
  1905. from enum import Flag
  1906. from textwrap import dedent
  1907. from warnings import warn
  1908. # QtCore and Qt come as globals.
  1909. def func_or(self, other):
  1910. if isinstance(self, Flag) and isinstance(other, Flag):
  1911. # this is normal or-ing flags together
  1912. return Qt.KeyboardModifier(self.value | other.value)
  1913. return QtCore.QKeyCombination(self, other)
  1914. def func_add(self, other):
  1915. warn(dedent(f"""
  1916. The "+" operator is deprecated in Qt For Python 6.0 .
  1917. Please use "|" instead."""), stacklevel=2)
  1918. return func_or(self, other)
  1919. Qt.KeyboardModifier.__or__ = func_or
  1920. Qt.KeyboardModifier.__ror__ = func_or
  1921. Qt.Modifier.__or__ = func_or
  1922. Qt.Modifier.__ror__ = func_or
  1923. Qt.KeyboardModifier.__add__ = func_add
  1924. Qt.KeyboardModifier.__radd__ = func_add
  1925. Qt.Modifier.__add__ = func_add
  1926. Qt.Modifier.__radd__ = func_add
  1927. )PY", Py_file_input, _inputDict, _inputDict);
  1928. // @snippet qt-modifier
  1929. // @snippet qdirlisting-iter
  1930. auto result = QtCoreHelper::QDirListingIterator(*%CPPSELF);
  1931. %PYARG_0 = %CONVERTTOPYTHON[QtCoreHelper::QDirListingIterator](result);
  1932. // @snippet qdirlisting-iter
  1933. // @snippet qdirlistingiterator-next
  1934. if (%CPPSELF.next()) {
  1935. Py_INCREF(%PYSELF);
  1936. %PYARG_0 = %PYSELF;
  1937. }
  1938. // @snippet qdirlistingiterator-next
  1939. // @snippet qdirlisting-direntry-repr
  1940. QByteArray result = '<' + QByteArray(PepType_GetFullyQualifiedNameStr(Py_TYPE(%PYSELF)))
  1941. + " object at 0x"
  1942. + QByteArray::number(quintptr(%PYSELF), 16) + " (\""
  1943. + %CPPSELF.absoluteFilePath().toUtf8() + "\")>";
  1944. %PYARG_0 = Shiboken::String::fromCString(result.constData());
  1945. // @snippet qdirlisting-direntry-repr
  1946. // @snippet return-native-eventfilter-conversion
  1947. %RETURN_TYPE %out = false;
  1948. if (PySequence_Check(%PYARG_0) != 0 && PySequence_Size(%PYARG_0) == 2) {
  1949. Shiboken::AutoDecRef pyItem(PySequence_GetItem(%PYARG_0, 0));
  1950. %out = %CONVERTTOCPP[bool](pyItem);
  1951. if (result) {
  1952. Shiboken::AutoDecRef pyResultItem(PySequence_GetItem(pyResult, 1));
  1953. *result = %CONVERTTOCPP[qintptr](pyResultItem);
  1954. }
  1955. }
  1956. // @snippet return-native-eventfilter-conversion
  1957. // @snippet return-native-eventfilter
  1958. %PYARG_0 = PyTuple_New(2);
  1959. PyTuple_SetItem(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](%0));
  1960. PyTuple_SetItem(%PYARG_0, 1, %CONVERTTOPYTHON[qintptr](*result_out));
  1961. // @snippet return-native-eventfilter
  1962. // @snippet qrangemodel-wrapper
  1963. // Import the template constructors
  1964. using QRangeModel::QRangeModel;
  1965. // @snippet qrangemodel-wrapper
  1966. // @snippet qrangemodel-helper-functions
  1967. template <class T>
  1968. static inline QSpan<T> createSpan(void *vData, Py_ssize_t size)
  1969. {
  1970. auto *data = reinterpret_cast<T *>(vData);
  1971. return QSpan<T>{data, data + size};
  1972. }
  1973. // Simple 2d table range for creating a QRangeModel
  1974. // (potentially replaceable by a std::mdspan in C++ 23).
  1975. template <class T>
  1976. class TableRange
  1977. {
  1978. struct TableData
  1979. {
  1980. T *data = nullptr;
  1981. qsizetype rowCount = -1;
  1982. qsizetype columCount = -1;
  1983. };
  1984. public:
  1985. explicit TableRange(void *data, qsizetype rowCount, qsizetype columCount) :
  1986. m_data{reinterpret_cast<T *>(data), rowCount, columCount} {}
  1987. class Iterator
  1988. {
  1989. public:
  1990. using value_type = QSpan<T>;
  1991. using size_type = qsizetype;
  1992. using reference = value_type;
  1993. using pointer = value_type;
  1994. using difference_type = std::ptrdiff_t;
  1995. using iterator_category = std::random_access_iterator_tag;
  1996. explicit Iterator(const TableData &data, size_type row) noexcept:
  1997. m_data(data), m_row(row) {}
  1998. Iterator() = default;
  1999. constexpr Iterator &operator++() noexcept
  2000. {
  2001. Q_ASSERT(m_row < m_data.rowCount);
  2002. ++m_row;
  2003. return *this;
  2004. }
  2005. constexpr Iterator operator++(int) noexcept
  2006. {
  2007. Q_ASSERT(m_row < m_data.rowCount);
  2008. auto copy = *this;
  2009. ++m_row;
  2010. return copy;
  2011. }
  2012. constexpr Iterator &operator--() noexcept
  2013. {
  2014. Q_ASSERT(m_row > 0);
  2015. --m_row;
  2016. return *this;
  2017. }
  2018. constexpr Iterator operator--(int) noexcept
  2019. {
  2020. Q_ASSERT(m_row > 0);
  2021. auto copy = *this;
  2022. --m_row;
  2023. return copy;
  2024. }
  2025. Iterator &operator+=(difference_type i)
  2026. {
  2027. const auto row = m_row + i;
  2028. Q_ASSERT(row >= 0 && row <= m_data.rowCount);
  2029. m_row = row;
  2030. return *this;
  2031. }
  2032. Iterator &operator-=(difference_type i)
  2033. {
  2034. const auto row = m_row - i;
  2035. Q_ASSERT(row >= 0 && row <= m_data.rowCount);
  2036. m_row = row;
  2037. return *this;
  2038. }
  2039. Iterator operator+(difference_type i) const
  2040. {
  2041. const auto row = m_row + i;
  2042. Q_ASSERT(row >= 0 && row <= m_data.rowCount);
  2043. return {m_data, row};
  2044. }
  2045. Iterator operator-(difference_type i) const
  2046. {
  2047. const auto row = m_row - i;
  2048. Q_ASSERT(row >= 0 && row <= m_data.rowCount);
  2049. return {m_data, row};
  2050. }
  2051. difference_type operator-(const Iterator &it) const { return m_row - it.m_row; } // std::distance
  2052. reference operator*() const noexcept
  2053. {
  2054. auto *rowStart = m_data.data + m_row * m_data.columCount;
  2055. return {rowStart, rowStart + m_data.columCount};
  2056. }
  2057. [[nodiscard]] value_type operator[](difference_type i) const
  2058. {
  2059. auto *rowStart = m_data.data + (m_row + i) * m_data.columCount;
  2060. return {rowStart, rowStart + m_data.columCount};
  2061. }
  2062. private:
  2063. friend bool comparesEqual(const Iterator &lhs, const Iterator &rhs) noexcept
  2064. {
  2065. Q_ASSERT(lhs.m_data.data != nullptr);
  2066. Q_ASSERT(lhs.m_data.data == rhs.m_data.data);
  2067. return lhs.m_row == rhs.m_row;
  2068. }
  2069. friend Qt::strong_ordering compareThreeWay(const Iterator &lhs,
  2070. const Iterator &rhs) noexcept
  2071. {
  2072. Q_ASSERT(lhs.m_data.data != nullptr);
  2073. Q_ASSERT(lhs.m_data.data == rhs.m_data.data);
  2074. return Qt::compareThreeWay(lhs.m_row, rhs.m_row);
  2075. }
  2076. Q_DECLARE_STRONGLY_ORDERED(Iterator)
  2077. TableData m_data;
  2078. size_type m_row = 0;
  2079. };
  2080. [[nodiscard]] Iterator begin() const { return Iterator(m_data, 0); }
  2081. [[nodiscard]] Iterator end() const { return Iterator(m_data, m_data.rowCount); }
  2082. private:
  2083. TableData m_data;
  2084. };
  2085. template <class RangeModel> // QRangeModelWrapper
  2086. static RangeModel *createRangeModel(PyObject *in, QObject *parent)
  2087. {
  2088. auto view = Shiboken::Numpy::View::fromPyObject(in);
  2089. if (!view) {
  2090. PyErr_SetString(PyExc_TypeError, "Invalid parameter or missing numpy support.");
  2091. return nullptr;
  2092. }
  2093. switch (view.ndim) {
  2094. case 1: {
  2095. const auto size = view.dimensions[0];
  2096. switch (view.type) {
  2097. case Shiboken::Numpy::View::Int16:
  2098. return new RangeModel(createSpan<short>(view.data, size), parent);
  2099. case Shiboken::Numpy::View::Unsigned16:
  2100. return new RangeModel(createSpan<unsigned short>(view.data, size), parent);
  2101. case Shiboken::Numpy::View::Int:
  2102. return new RangeModel(createSpan<int>(view.data, size), parent);
  2103. case Shiboken::Numpy::View::Unsigned:
  2104. return new RangeModel(createSpan<unsigned>(view.data, size), parent);
  2105. case Shiboken::Numpy::View::Int64:
  2106. return new RangeModel(createSpan<int64_t>(view.data, size), parent);
  2107. case Shiboken::Numpy::View::Unsigned64:
  2108. return new RangeModel(createSpan<uint64_t>(view.data, size), parent);
  2109. case Shiboken::Numpy::View::Float:
  2110. return new RangeModel(createSpan<float>(view.data, size), parent);
  2111. case Shiboken::Numpy::View::Double:
  2112. return new RangeModel(createSpan<double>(view.data, size), parent);
  2113. default:
  2114. PyErr_SetString(PyExc_TypeError, "Unsupported data type for one-dimensional arrays.");
  2115. return nullptr;
  2116. }
  2117. }
  2118. break;
  2119. case 2: {
  2120. const auto rows = view.dimensions[0];
  2121. const auto columns = view.dimensions[1];
  2122. switch (view.type) {
  2123. case Shiboken::Numpy::View::Int16:
  2124. return new RangeModel(TableRange<short>(view.data, rows, columns), parent);
  2125. case Shiboken::Numpy::View::Unsigned16:
  2126. return new RangeModel(TableRange<unsigned short>(view.data, rows, columns), parent);
  2127. case Shiboken::Numpy::View::Int:
  2128. return new RangeModel(TableRange<int>(view.data, rows, columns), parent);
  2129. case Shiboken::Numpy::View::Unsigned:
  2130. return new RangeModel(TableRange<unsigned>(view.data, rows, columns), parent);
  2131. case Shiboken::Numpy::View::Int64:
  2132. return new RangeModel(TableRange<int64_t>(view.data, rows, columns), parent);
  2133. case Shiboken::Numpy::View::Unsigned64:
  2134. return new RangeModel(TableRange<uint64_t>(view.data, rows, columns), parent);
  2135. case Shiboken::Numpy::View::Float:
  2136. return new RangeModel(TableRange<float>(view.data, rows, columns), parent);
  2137. case Shiboken::Numpy::View::Double:
  2138. return new RangeModel(TableRange<double>(view.data, rows, columns), parent);
  2139. default:
  2140. PyErr_SetString(PyExc_TypeError, "Unsupported data type for two-dimensional arrays.");
  2141. return nullptr;
  2142. }
  2143. }
  2144. break;
  2145. default:
  2146. PyErr_SetString(PyExc_TypeError, "Only one and two-dimensional arrays are supported.");
  2147. return nullptr;
  2148. }
  2149. return nullptr;
  2150. }
  2151. static bool isVariantList(const QVariant &v)
  2152. {
  2153. return v.typeId() == QMetaType::QVariantList;
  2154. };
  2155. // @snippet qrangemodel-helper-functions
  2156. // @snippet qrangemodel-numpy-constructor
  2157. auto *model = createRangeModel<%TYPE>(%PYARG_1, %2);
  2158. if (model == nullptr)
  2159. return -1;
  2160. %0 = model;
  2161. // @snippet qrangemodel-numpy-constructor
  2162. // @snippet qrangemodel-sequence-constructor
  2163. const auto vlOptional = PySide::Variant::pyListToVariantList(%PYARG_1);
  2164. if (!vlOptional.has_value()) {
  2165. PyErr_SetString(PyExc_TypeError, "Unable convert input sequence.");
  2166. return -1;
  2167. }
  2168. const QVariantList &vList = vlOptional.value();
  2169. if (!vList.isEmpty() && std::all_of(vList.cbegin(), vList.cend(), isVariantList)) {
  2170. // Empirical: Transform QVariantList<QVariant(List)> -> QList<QVariantList> for a table
  2171. QList<QVariantList> variantTable;
  2172. variantTable.reserve(vList.size());
  2173. for (const auto &rowV : vList)
  2174. variantTable.append(rowV.value<QVariantList>());
  2175. %0 = new %TYPE(variantTable, %2);
  2176. } else {
  2177. %0 = new %TYPE(vList, %2);
  2178. }
  2179. // @snippet qrangemodel-sequence-constructor