@@ -135,7 +135,7 @@ void PythonQt::init(int flags, const QByteArray& pythonQtModuleName)
135
135
PythonQtRegisterToolClassesTemplateConverter (quint32);
136
136
PythonQtRegisterToolClassesTemplateConverter (qint64);
137
137
PythonQtRegisterToolClassesTemplateConverter (quint64);
138
-
138
+
139
139
#ifdef PYTHONQT_SUPPORT_ML_TYPES
140
140
PythonQtMethodInfo::addParameterTypeAlias (" QList<MLfloat>" , " QList<float>" );
141
141
PythonQtMethodInfo::addParameterTypeAlias (" QVector<MLfloat>" , " QVector<float>" );
@@ -295,7 +295,7 @@ void PythonQt::init(int flags, const QByteArray& pythonQtModuleName)
295
295
" QtFatalMsg" ,
296
296
" QtSystemMsg"
297
297
};
298
-
298
+
299
299
for (auto i = 0u ; i < sizeof (enumValues)/sizeof (int ); i++) {
300
300
PyObject* obj = PyInt_FromLong (enumValues[i]);
301
301
if (PyModule_AddObject (pack, enumNames[i], obj) == 0 ) {
@@ -706,7 +706,7 @@ PyObject* PythonQtPrivate::wrapPtr(void* ptr, const QByteArray& name, bool passO
706
706
return (PyObject*)wrap;
707
707
}
708
708
709
- // not a known QObject, try to wrap via foreign wrapper factories
709
+ // not a known QObject, try to wrap via foreign wrapper factories
710
710
PyObject* foreignWrapper = nullptr ;
711
711
for (int i=0 ; i<_foreignWrapperFactories.size (); i++) {
712
712
foreignWrapper = _foreignWrapperFactories.at (i)->wrap (name, ptr);
@@ -1097,7 +1097,7 @@ PythonQtObjectPtr PythonQt::parseFileWithPythonLoaders(const QString& file)
1097
1097
loader.setNewRef (callAndReturnPyObject (loaderClass, args));
1098
1098
QVariantList args2;
1099
1099
args2 << dummy;
1100
- PythonQtObjectPtr getCode;
1100
+ PythonQtObjectPtr getCode;
1101
1101
getCode.setNewRef (PyObject_GetAttrString (loader, " get_code" ));
1102
1102
result.setNewRef (callAndReturnPyObject (getCode, args2));
1103
1103
if (!result) {
@@ -1344,28 +1344,28 @@ PyObject* PythonQt::getObjectByType(const QString& typeName)
1344
1344
sys.setNewRef (PyImport_ImportModule (" sys" ));
1345
1345
PythonQtObjectPtr modules = lookupObject (sys, " modules" );
1346
1346
Q_ASSERT (PyDict_Check (modules));
1347
-
1347
+
1348
1348
QStringList tmp = typeName.split (" ." );
1349
1349
QString simpleTypeName = tmp.takeLast ();
1350
1350
QString moduleName = tmp.join (" ." );
1351
-
1351
+
1352
1352
PyObject* object = nullptr ;
1353
1353
PyObject* moduleObject = PyDict_GetItemString (modules, QStringToPythonCharPointer (moduleName));
1354
1354
if (moduleObject) {
1355
1355
object = PyObject_GetAttrString (moduleObject, QStringToPythonCharPointer (simpleTypeName));
1356
1356
}
1357
-
1357
+
1358
1358
if (!object) {
1359
1359
moduleObject = PyDict_GetItemString (modules, " __builtin__" );
1360
1360
if (moduleObject) {
1361
1361
object = PyObject_GetAttrString (moduleObject, QStringToPythonCharPointer (simpleTypeName));
1362
1362
}
1363
1363
}
1364
-
1364
+
1365
1365
PyErr_Clear ();
1366
1366
return object;
1367
1367
}
1368
-
1368
+
1369
1369
QStringList PythonQt::introspectType (const QString& typeName, ObjectType type)
1370
1370
{
1371
1371
QStringList results;
@@ -1876,18 +1876,22 @@ void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQ
1876
1876
PythonQtObjectPtr sys;
1877
1877
sys.setNewRef (PyImport_ImportModule (" sys" ));
1878
1878
1879
- if (redirectStdOut) {
1880
- PythonQtObjectPtr out;
1881
- PythonQtObjectPtr err;
1882
- // create a redirection object for stdout and stderr
1883
- out = PythonQtStdOutRedirectType.tp_new (&PythonQtStdOutRedirectType,nullptr , nullptr );
1884
- ((PythonQtStdOutRedirect*)out.object ())->_cb = stdOutRedirectCB;
1885
- err = PythonQtStdOutRedirectType.tp_new (&PythonQtStdOutRedirectType,nullptr , nullptr );
1886
- ((PythonQtStdOutRedirect*)err.object ())->_cb = stdErrRedirectCB;
1887
- // replace the built in file objects with our own objects
1888
- PyModule_AddObject (sys, " stdout" , out);
1889
- PyModule_AddObject (sys, " stderr" , err);
1890
- }
1879
+ // Backup original 'sys.stdout' and 'sys.stderr'
1880
+ PyModule_AddObject (sys, " pythonqt_original_stdout" , PyObject_GetAttrString (sys, " stdout" ));
1881
+ PyModule_AddObject (sys, " pythonqt_original_stderr" , PyObject_GetAttrString (sys, " stderr" ));
1882
+
1883
+ // Create a redirection object for stdout and stderr
1884
+ PythonQtObjectPtr out;
1885
+ PythonQtObjectPtr err;
1886
+ out = PythonQtStdOutRedirectType.tp_new (&PythonQtStdOutRedirectType,nullptr , nullptr );
1887
+ ((PythonQtStdOutRedirect*)out.object ())->_cb = stdOutRedirectCB;
1888
+ err = PythonQtStdOutRedirectType.tp_new (&PythonQtStdOutRedirectType,nullptr , nullptr );
1889
+ ((PythonQtStdOutRedirect*)err.object ())->_cb = stdErrRedirectCB;
1890
+ // replace the built in file objects with our own objects
1891
+ PyModule_AddObject (sys, " pythonqt_stdout" , out);
1892
+ PyModule_AddObject (sys, " pythonqt_stderr" , err);
1893
+
1894
+ setRedirectStdOutCallbackEnabled (redirectStdOut);
1891
1895
1892
1896
// add PythonQt to the list of builtin module names
1893
1897
PyObject *old_module_names = PyObject_GetAttrString (sys.object ()," builtin_module_names" );
@@ -1909,12 +1913,48 @@ void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQ
1909
1913
#endif
1910
1914
}
1911
1915
1916
+ bool PythonQt::redirectStdOutCallbackEnabled () const
1917
+ {
1918
+ PythonQtObjectPtr sys;
1919
+ sys.setNewRef (PyImport_ImportModule (" sys" ));
1920
+
1921
+ PythonQtObjectPtr pythonqt_stdout;
1922
+ pythonqt_stdout.setNewRef (PyObject_GetAttrString (sys.object (), " pythonqt_stdout" ));
1923
+
1924
+ PythonQtObjectPtr stdout;
1925
+ stdout.setNewRef (PyObject_GetAttrString (sys.object (), " stdout" ));
1926
+
1927
+ return PyObject_RichCompareBool (pythonqt_stdout.object (), stdout.object (), Py_EQ);
1928
+ }
1929
+
1930
+ void PythonQt::setRedirectStdOutCallbackEnabled (bool enabled)
1931
+ {
1932
+ PythonQtObjectPtr sys;
1933
+ sys.setNewRef (PyImport_ImportModule (" sys" ));
1934
+
1935
+ if (enabled) {
1936
+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_stdout" ) ) {
1937
+ PyModule_AddObject (sys.object (), " stdout" , PyObject_GetAttrString (sys.object (), " pythonqt_stdout" ));
1938
+ }
1939
+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_stderr" ) ) {
1940
+ PyModule_AddObject (sys.object (), " stderr" , PyObject_GetAttrString (sys.object (), " pythonqt_stderr" ));
1941
+ }
1942
+ } else {
1943
+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_original_stdout" ) ) {
1944
+ PyModule_AddObject (sys.object (), " stdout" , PyObject_GetAttrString (sys.object (), " pythonqt_original_stdout" ));
1945
+ }
1946
+ if ( PyObject_HasAttrString (sys.object (), " pythonqt_original_stderr" ) ) {
1947
+ PyModule_AddObject (sys.object (), " stderr" , PyObject_GetAttrString (sys.object (), " pythonqt_original_stderr" ));
1948
+ }
1949
+ }
1950
+ }
1951
+
1912
1952
QString PythonQt::getReturnTypeOfWrappedMethod (PyObject* module , const QString& name)
1913
1953
{
1914
1954
QStringList tmp = name.split (" ." );
1915
1955
QString methodName = tmp.takeLast ();
1916
1956
QString variableName = tmp.join (" ." );
1917
- PythonQtObjectPtr variableObject = lookupObject (module , variableName);
1957
+ PythonQtObjectPtr variableObject = lookupObject (module , variableName);
1918
1958
if (variableObject.isNull ()) {
1919
1959
// try lookup by interpreting the variableName as a type
1920
1960
QString type = getReturnTypeOfWrappedMethod (variableName, methodName);
@@ -1943,9 +1983,9 @@ QString PythonQt::getReturnTypeOfWrappedMethodHelper(const PythonQtObjectPtr& va
1943
1983
if (methodObject.isNull ()) {
1944
1984
return " " ;
1945
1985
}
1946
-
1986
+
1947
1987
QString type;
1948
-
1988
+
1949
1989
if (PythonQtUtils::isPythonClassType (methodObject)) {
1950
1990
// the methodObject is not a method, but the name of a type/class. This means
1951
1991
// a constructor is called. Return the context.
@@ -2376,13 +2416,13 @@ void PythonQtPrivate::callMethodInPython(QMetaMethod &method, PythonQtInstanceWr
2376
2416
QString PythonQtPrivate::getSignature (PyObject* object)
2377
2417
{
2378
2418
QString signature;
2379
-
2419
+
2380
2420
if (object) {
2381
2421
PyMethodObject* method = nullptr ;
2382
2422
PyFunctionObject* func = nullptr ;
2383
-
2423
+
2384
2424
bool decrefMethod = false ;
2385
-
2425
+
2386
2426
if (PythonQtUtils::isPythonClassType (object)) {
2387
2427
method = (PyMethodObject*)PyObject_GetAttrString (object, " __init__" );
2388
2428
decrefMethod = true ;
@@ -2418,7 +2458,7 @@ QString PythonQtPrivate::getSignature(PyObject* object)
2418
2458
}
2419
2459
}
2420
2460
}
2421
-
2461
+
2422
2462
if (func) {
2423
2463
QString funcName;
2424
2464
PyObject* s = PyObject_GetAttrString ((PyObject*)func, " __name__" );
@@ -2435,7 +2475,7 @@ QString PythonQtPrivate::getSignature(PyObject* object)
2435
2475
Py_DECREF (s);
2436
2476
}
2437
2477
}
2438
-
2478
+
2439
2479
QStringList arguments;
2440
2480
QStringList defaults;
2441
2481
QString varargs;
@@ -2465,7 +2505,7 @@ QString PythonQtPrivate::getSignature(PyObject* object)
2465
2505
}
2466
2506
Py_DECREF (co_varnames);
2467
2507
}
2468
-
2508
+
2469
2509
PyObject* defaultsTuple = func->func_defaults ;
2470
2510
if (defaultsTuple) {
2471
2511
Q_ASSERT (PyTuple_Check (defaultsTuple));
@@ -2477,7 +2517,7 @@ QString PythonQtPrivate::getSignature(PyObject* object)
2477
2517
Py_DECREF (s);
2478
2518
}
2479
2519
}
2480
-
2520
+
2481
2521
int firstdefault = arguments.size () - defaults.size ();
2482
2522
for (int i=0 ; i<arguments.size (); i++) {
2483
2523
if (!signature.isEmpty ()) { signature += " , " ; }
@@ -2498,12 +2538,12 @@ QString PythonQtPrivate::getSignature(PyObject* object)
2498
2538
}
2499
2539
signature = funcName + " (" + signature + " )" ;
2500
2540
}
2501
-
2541
+
2502
2542
if (method && decrefMethod) {
2503
2543
Py_DECREF (method);
2504
2544
}
2505
2545
}
2506
-
2546
+
2507
2547
return signature;
2508
2548
}
2509
2549
0 commit comments