@@ -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 }
@@ -1537,6 +1544,10 @@ PythonQtClassInfo* PythonQtPrivate::currentClassInfoForClassWrapperCreation()
15371544
15381545void PythonQtPrivate::addDecorators (QObject* o, int decoTypes)
15391546{
1547+ if (!o)
1548+ {
1549+ return ;
1550+ }
15401551 o->setParent (this );
15411552 int numMethods = o->metaObject ()->methodCount ();
15421553 for (int i = 0 ; i < numMethods; i++) {
@@ -1865,6 +1876,42 @@ void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQ
18651876 Py_XDECREF (pyUnicodeObject);
18661877}
18671878
1879+ bool PythonQt::redirectStdOutCallbackEnabled () const
1880+ {
1881+ PythonQtObjectPtr sys;
1882+ sys.setNewRef (PyImport_ImportModule (" sys" ));
1883+
1884+ PythonQtObjectPtr pythonqt_stdout;
1885+ pythonqt_stdout.setNewRef (PyObject_GetAttrString (sys.object (), " pythonqt_stdout" ));
1886+
1887+ PythonQtObjectPtr sys_stdout;
1888+ sys_stdout.setNewRef (PyObject_GetAttrString (sys.object (), " stdout" ));
1889+
1890+ return PyObject_RichCompareBool (pythonqt_stdout.object (), sys_stdout.object (), Py_EQ);
1891+ }
1892+
1893+ void PythonQt::setRedirectStdOutCallbackEnabled (bool enabled)
1894+ {
1895+ PythonQtObjectPtr sys;
1896+ sys.setNewRef (PyImport_ImportModule (" sys" ));
1897+
1898+ if (enabled) {
1899+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_stdout" ) ) {
1900+ PyModule_AddObject (sys.object (), " stdout" , PyObject_GetAttrString (sys.object (), " pythonqt_stdout" ));
1901+ }
1902+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_stderr" ) ) {
1903+ PyModule_AddObject (sys.object (), " stderr" , PyObject_GetAttrString (sys.object (), " pythonqt_stderr" ));
1904+ }
1905+ } else {
1906+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_original_stdout" ) ) {
1907+ PyModule_AddObject (sys.object (), " stdout" , PyObject_GetAttrString (sys.object (), " pythonqt_original_stdout" ));
1908+ }
1909+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_original_stderr" ) ) {
1910+ PyModule_AddObject (sys.object (), " stderr" , PyObject_GetAttrString (sys.object (), " pythonqt_original_stderr" ));
1911+ }
1912+ }
1913+ }
1914+
18681915QString PythonQt::getReturnTypeOfWrappedMethod (PyObject* module , const QString& name)
18691916{
18701917 QStringList tmp = name.split (" ." );
0 commit comments