@@ -258,6 +258,9 @@ void PythonQt::init(int flags, const QByteArray& pythonQtModuleName)
258258 PythonQtRegisterToolClassesTemplateConverterForKnownClass (QPen);
259259 PythonQtRegisterToolClassesTemplateConverterForKnownClass (QTextLength);
260260 PythonQtRegisterToolClassesTemplateConverterForKnownClass (QTextFormat);
261+ #if QT_VERSION < 0x060000
262+ PythonQtRegisterToolClassesTemplateConverterForKnownClass (QMatrix);
263+ #endif
261264
262265 PyObject* pack = PythonQt::priv ()->packageByName (" QtCore" );
263266 PyObject* pack2 = PythonQt::priv ()->packageByName (" Qt" );
@@ -321,6 +324,10 @@ void PythonQt::init(int flags, const QByteArray& pythonQtModuleName)
321324void PythonQt::cleanup ()
322325{
323326 if (_self) {
327+ // Remove signal handlers in advance, since destroying them calls back into
328+ // PythonQt::priv()->removeSignalEmitter()
329+ _self->removeSignalHandlers ();
330+
324331 delete _self;
325332 _self = nullptr ;
326333 }
@@ -1548,6 +1555,10 @@ PythonQtClassInfo* PythonQtPrivate::currentClassInfoForClassWrapperCreation()
15481555
15491556void PythonQtPrivate::addDecorators (QObject* o, int decoTypes)
15501557{
1558+ if (!o)
1559+ {
1560+ return ;
1561+ }
15511562 o->setParent (this );
15521563 int numMethods = o->metaObject ()->methodCount ();
15531564 for (int i = 0 ; i < numMethods; i++) {
@@ -1841,7 +1852,13 @@ void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQ
18411852 PythonQtObjectPtr sys;
18421853 sys.setNewRef (PyImport_ImportModule (" sys" ));
18431854
1844- if (redirectStdOut) {
1855+ if (redirectStdOut)
1856+ {
1857+ // Backup original 'sys.stdout' and 'sys.stderr'
1858+ PyModule_AddObject (sys, " pythonqt_original_stdout" , PyObject_GetAttrString (sys, " stdout" ));
1859+ PyModule_AddObject (sys, " pythonqt_original_stderr" , PyObject_GetAttrString (sys, " stderr" ));
1860+
1861+ // Create a redirection object for stdout and stderr
18451862 PythonQtObjectPtr out;
18461863 PythonQtObjectPtr err;
18471864 // create a redirection object for stdout and stderr
@@ -1850,10 +1867,11 @@ void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQ
18501867 err = PythonQtStdOutRedirectType.tp_new (&PythonQtStdOutRedirectType,nullptr , nullptr );
18511868 ((PythonQtStdOutRedirect*)err.object ())->_cb = stdErrRedirectCB;
18521869 // replace the built in file objects with our own objects
1853- PyModule_AddObject (sys, " stdout" , out);
1854- PyModule_AddObject (sys, " stderr" , err);
1855- }
1870+ PyModule_AddObject (sys, " pythonqt_stdout" , out);
1871+ PyModule_AddObject (sys, " pythonqt_stderr" , err);
18561872
1873+ setRedirectStdOutCallbackEnabled (redirectStdOut);
1874+ }
18571875 // add PythonQt to the list of builtin module names
18581876 PyObject *old_module_names = PyObject_GetAttrString (sys.object ()," builtin_module_names" );
18591877 if (old_module_names && PyTuple_Check (old_module_names)) {
@@ -1876,6 +1894,42 @@ void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQ
18761894 Py_XDECREF (pyUnicodeObject);
18771895}
18781896
1897+ bool PythonQt::redirectStdOutCallbackEnabled () const
1898+ {
1899+ PythonQtObjectPtr sys;
1900+ sys.setNewRef (PyImport_ImportModule (" sys" ));
1901+
1902+ PythonQtObjectPtr pythonqt_stdout;
1903+ pythonqt_stdout.setNewRef (PyObject_GetAttrString (sys.object (), " pythonqt_stdout" ));
1904+
1905+ PythonQtObjectPtr sys_stdout;
1906+ sys_stdout.setNewRef (PyObject_GetAttrString (sys.object (), " stdout" ));
1907+
1908+ return PyObject_RichCompareBool (pythonqt_stdout.object (), sys_stdout.object (), Py_EQ);
1909+ }
1910+
1911+ void PythonQt::setRedirectStdOutCallbackEnabled (bool enabled)
1912+ {
1913+ PythonQtObjectPtr sys;
1914+ sys.setNewRef (PyImport_ImportModule (" sys" ));
1915+
1916+ if (enabled) {
1917+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_stdout" ) ) {
1918+ PyModule_AddObject (sys.object (), " stdout" , PyObject_GetAttrString (sys.object (), " pythonqt_stdout" ));
1919+ }
1920+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_stderr" ) ) {
1921+ PyModule_AddObject (sys.object (), " stderr" , PyObject_GetAttrString (sys.object (), " pythonqt_stderr" ));
1922+ }
1923+ } else {
1924+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_original_stdout" ) ) {
1925+ PyModule_AddObject (sys.object (), " stdout" , PyObject_GetAttrString (sys.object (), " pythonqt_original_stdout" ));
1926+ }
1927+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_original_stderr" ) ) {
1928+ PyModule_AddObject (sys.object (), " stderr" , PyObject_GetAttrString (sys.object (), " pythonqt_original_stderr" ));
1929+ }
1930+ }
1931+ }
1932+
18791933QString PythonQt::getReturnTypeOfWrappedMethod (PyObject* module , const QString& name)
18801934{
18811935 QStringList tmp = name.split (" ." );
0 commit comments