Skip to content

Commit e9b1acf

Browse files
committed
ENH: Add support for Python 3.12+
Initialization APIs and update deprecated usage
1 parent 0b1e6bf commit e9b1acf

File tree

2 files changed

+73
-5
lines changed

2 files changed

+73
-5
lines changed

generated_cpp_515/com_trolltech_qt_core/com_trolltech_qt_core4.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ enum class QCborSimpleType{
417417
enum class QCborTag{
418418
};
419419
enum QtMsgType{
420-
QtDebugMsg = ::QtDebugMsg, QtWarningMsg = ::QtWarningMsg, QtCriticalMsg = ::QtCriticalMsg, QtFatalMsg = ::QtFatalMsg, QtInfoMsg = ::QtInfoMsg, QtSystemMsg = ::QtSystemMsg};
420+
QtDebugMsg = ::QtDebugMsg, QtWarningMsg = ::QtWarningMsg, QtCriticalMsg = ::QtCriticalMsg, QtFatalMsg = ::QtFatalMsg, QtInfoMsg = ::QtInfoMsg, QtCriticalMsg = ::QtCriticalMsg};
421421
public slots:
422422
};
423423

src/PythonQt.cpp

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)