@@ -287,15 +287,17 @@ void PythonQt::init(int flags, const QByteArray& pythonQtModuleName)
287287 QtDebugMsg,
288288 QtWarningMsg,
289289 QtCriticalMsg,
290+ QtCriticalMsg,
290291 QtFatalMsg,
291- QtSystemMsg
292+ QtCriticalMsg
292293 };
293294 const char * enumNames[] = {
294295 " QtDebugMsg" ,
295296 " QtWarningMsg" ,
296- " QtCriticalMsg" ,
297+ " QtCriticalMsg" , // Qt6 replacement of QtSystemMsg
298+ " QtSystemMsg" , // Qt5 deprecated name QtSystemMsg
297299 " QtFatalMsg" ,
298- " QtSystemMsg "
300+ " QtCriticalMsg "
299301 };
300302
301303 for (auto i = 0u ; i < sizeof (enumValues)/sizeof (int ); i++) {
@@ -341,11 +343,71 @@ PythonQt::PythonQt(int flags, const QByteArray& pythonQtModuleName)
341343 _p->_initFlags = flags;
342344
343345 if ((flags & PythonAlreadyInitialized) == 0 ) {
344- Py_SetProgramName (const_cast <wchar_t *>(L" PythonQt" ));
346+ #if PY_VERSION_HEX < 0x030C0000
347+ // Python < 3.12: legacy initialization
348+ Py_SetProgramName ((wchar_t *)L" PythonQt" );
349+ Py_Initialize ();
350+
351+ #elif PY_VERSION_HEX < 0x030D0000
352+ // Python 3.12: Py_SetProgramName is deprecated, use PyConfig
353+ PyConfig config;
354+ PyStatus status;
355+
356+ PyConfig_InitPythonConfig (&config);
357+ status = PyConfig_SetString (&config, &config.program_name , L" PythonQt" );
358+ if (PyStatus_Exception (status)) {
359+ PyConfig_Clear (&config);
360+ Py_ExitStatusException (status);
361+ }
362+
363+ status = Py_InitializeFromConfig (&config);
364+ PyConfig_Clear (&config);
365+ if (PyStatus_Exception (status)) {
366+ Py_ExitStatusException (status);
367+ }
368+
369+ #else
370+ // Python >= 3.13: Py_SetProgramName is removed
371+ PyConfig config;
372+ PyStatus status;
373+
374+ PyConfig_InitPythonConfig (&config);
375+ status = PyConfig_SetString (&config, &config.program_name , L" PythonQt" );
376+ if (PyStatus_Exception (status)) {
377+ PyConfig_Clear (&config);
378+ Py_ExitStatusException (status);
379+ }
380+
381+ status = Py_InitializeFromConfig (&config);
382+ PyConfig_Clear (&config);
383+ if (PyStatus_Exception (status)) {
384+ Py_ExitStatusException (status);
385+ }
386+ #endif
387+
345388
346389 if (flags & IgnoreSiteModule) {
347390 // this prevents the automatic importing of Python site files
391+ #if PY_VERSION_HEX < 0x030B0000
392+ // Python < 3.11 // Use legacy global flags
348393 Py_NoSiteFlag = 1 ;
394+ Py_Initialize ();
395+ #elif PY_VERSION_HEX < 0x030D0000
396+ // Python == 3.12
397+ // Py_NoSiteFlag is deprecated (still available, but use PyConfig preferred)
398+ PyConfig config;
399+ PyStatus status;
400+
401+ PyConfig_InitPythonConfig (&config);
402+ config.site_import = 0 ;
403+
404+ status = Py_InitializeFromConfig (&config);
405+ PyConfig_Clear (&config);
406+
407+ if (PyStatus_Exception (status)) {
408+ Py_ExitStatusException (status);
409+ }
410+ #endif
349411 }
350412 Py_Initialize ();
351413 }
@@ -1155,7 +1217,13 @@ void PythonQt::removeVariable(PyObject* object, const QString& name)
11551217 if (PyDict_Check (object)) {
11561218 PyDict_DelItemString (object, QStringToPythonCharPointer (name));
11571219 } else {
1220+ #if PY_VERSION_HEX < 0x030C0000
11581221 PyObject_DelAttrString (object, QStringToPythonCharPointer (name));
1222+ #else
1223+ PyObject *pname = PyUnicode_FromString (QStringToPythonCharPointer (name));
1224+ PyObject_DelAttr (object, pname);
1225+ Py_DECREF (pname);
1226+ #endif
11591227 }
11601228}
11611229
0 commit comments