@@ -258,6 +258,9 @@ void PythonQt::init(int flags, const QByteArray& pythonQtModuleName)
258
258
PythonQtRegisterToolClassesTemplateConverterForKnownClass (QPen);
259
259
PythonQtRegisterToolClassesTemplateConverterForKnownClass (QTextLength);
260
260
PythonQtRegisterToolClassesTemplateConverterForKnownClass (QTextFormat);
261
+ #if QT_VERSION < 0x060000
262
+ PythonQtRegisterToolClassesTemplateConverterForKnownClass (QMatrix);
263
+ #endif
261
264
262
265
PyObject* pack = PythonQt::priv ()->packageByName (" QtCore" );
263
266
PyObject* pack2 = PythonQt::priv ()->packageByName (" Qt" );
@@ -321,6 +324,10 @@ void PythonQt::init(int flags, const QByteArray& pythonQtModuleName)
321
324
void PythonQt::cleanup ()
322
325
{
323
326
if (_self) {
327
+ // Remove signal handlers in advance, since destroying them calls back into
328
+ // PythonQt::priv()->removeSignalEmitter()
329
+ _self->removeSignalHandlers ();
330
+
324
331
delete _self;
325
332
_self = nullptr ;
326
333
}
@@ -1548,6 +1555,10 @@ PythonQtClassInfo* PythonQtPrivate::currentClassInfoForClassWrapperCreation()
1548
1555
1549
1556
void PythonQtPrivate::addDecorators (QObject* o, int decoTypes)
1550
1557
{
1558
+ if (!o)
1559
+ {
1560
+ return ;
1561
+ }
1551
1562
o->setParent (this );
1552
1563
int numMethods = o->metaObject ()->methodCount ();
1553
1564
for (int i = 0 ; i < numMethods; i++) {
@@ -1841,7 +1852,13 @@ void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQ
1841
1852
PythonQtObjectPtr sys;
1842
1853
sys.setNewRef (PyImport_ImportModule (" sys" ));
1843
1854
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
1845
1862
PythonQtObjectPtr out;
1846
1863
PythonQtObjectPtr err;
1847
1864
// create a redirection object for stdout and stderr
@@ -1850,10 +1867,11 @@ void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQ
1850
1867
err = PythonQtStdOutRedirectType.tp_new (&PythonQtStdOutRedirectType,nullptr , nullptr );
1851
1868
((PythonQtStdOutRedirect*)err.object ())->_cb = stdErrRedirectCB;
1852
1869
// 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);
1856
1872
1873
+ setRedirectStdOutCallbackEnabled (redirectStdOut);
1874
+ }
1857
1875
// add PythonQt to the list of builtin module names
1858
1876
PyObject *old_module_names = PyObject_GetAttrString (sys.object ()," builtin_module_names" );
1859
1877
if (old_module_names && PyTuple_Check (old_module_names)) {
@@ -1876,6 +1894,42 @@ void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQ
1876
1894
Py_XDECREF (pyUnicodeObject);
1877
1895
}
1878
1896
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
+
1879
1933
QString PythonQt::getReturnTypeOfWrappedMethod (PyObject* module , const QString& name)
1880
1934
{
1881
1935
QStringList tmp = name.split (" ." );
0 commit comments