Skip to content

Commit 08911ec

Browse files
committed
Add facility to set task done callback
- on async signal handlers (originally provided by @usiems)
1 parent 664c6c5 commit 08911ec

File tree

4 files changed

+40
-0
lines changed

4 files changed

+40
-0
lines changed

src/PythonQt.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ void PythonQt::init(int flags, const QByteArray& pythonQtModuleName)
274274
}
275275

276276
_self->priv()->pythonQtModule().addObject("Debug", _self->priv()->_debugAPI);
277+
_self->priv()->pythonQtModule().addObject("Config", _self->priv()->_configAPI);
277278

278279
Py_INCREF((PyObject*)&PythonQtSlotDecorator_Type);
279280
Py_INCREF((PyObject*)&PythonQtSignalFunction_Type);
@@ -396,6 +397,11 @@ PythonQtPrivate::~PythonQtPrivate() {
396397
PythonQtArgumentFrame::cleanupFreeList();
397398
}
398399

400+
void PythonQtPrivate::setTaskDoneCallback(const PythonQtObjectPtr & callable)
401+
{
402+
_pyTaskDoneCallback = callable;
403+
}
404+
399405
void PythonQt::setRedirectStdInCallback(PythonQtInputChangedCB* callback, void * callbackData)
400406
{
401407
if (!callback) {
@@ -1434,6 +1440,7 @@ PythonQtPrivate::PythonQtPrivate()
14341440
_hadError = false;
14351441
_systemExitExceptionHandlerEnabled = false;
14361442
_debugAPI = new PythonQtDebugAPI(this);
1443+
_configAPI = new PythonQtConfigAPI(this);
14371444
}
14381445

14391446
void PythonQtPrivate::setupSharedLibrarySuffixes()

src/PythonQt.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,7 @@ class PYTHONQT_EXPORT PythonQt : public QObject {
651651
};
652652

653653
class PythonQtDebugAPI;
654+
class PythonQtConfigAPI;
654655

655656
//! internal PythonQt details
656657
class PYTHONQT_EXPORT PythonQtPrivate : public QObject {
@@ -669,6 +670,10 @@ class PYTHONQT_EXPORT PythonQtPrivate : public QObject {
669670
AllDecorators = 0xffff
670671
};
671672

673+
//! Set a callable that is used as the argument for the add_done_callback for the Task
674+
//! created by checkAndRunCoroutine
675+
void setTaskDoneCallback(const PythonQtObjectPtr& callable);
676+
672677
//! get the suffixes that are used for shared libraries
673678
const QStringList& sharedLibrarySuffixes() { return _sharedLibrarySuffixes; }
674679

@@ -849,6 +854,8 @@ class PYTHONQT_EXPORT PythonQtPrivate : public QObject {
849854
PythonQtObjectPtr _pySourceFileLoader;
850855
PythonQtObjectPtr _pySourcelessFileLoader;
851856

857+
PythonQtObjectPtr _pyTaskDoneCallback;
858+
852859
//! the cpp object wrapper factories
853860
QList<PythonQtCppWrapperFactory*> _cppWrapperFactories;
854861

@@ -861,6 +868,7 @@ class PYTHONQT_EXPORT PythonQtPrivate : public QObject {
861868
PythonQt::ProfilingCB* _profilingCB;
862869

863870
PythonQtDebugAPI* _debugAPI;
871+
PythonQtConfigAPI* _configAPI;
864872

865873
int _initFlags;
866874
int _PythonQtObjectPtr_metaId;

src/PythonQtStdDecorators.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,17 @@ const QMetaObject* PythonQtStdDecorators::metaObject( QObject* obj )
354354
return obj->metaObject();
355355
}
356356

357+
//---------------------------------------------------------------------------
358+
359+
void PythonQtConfigAPI::setTaskDoneCallback(PyObject* object)
360+
{
361+
if (PythonQt::self()) {
362+
PythonQt::self()->priv()->setTaskDoneCallback(object);
363+
}
364+
}
365+
366+
//---------------------------------------------------------------------------
367+
357368
bool PythonQtDebugAPI::isOwnedByPython( PyObject* object )
358369
{
359370
if (PyObject_TypeCheck(object, &PythonQtInstanceWrapper_Type)) {

src/PythonQtStdDecorators.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,20 @@ public Q_SLOTS:
173173

174174
};
175175

176+
//! Some methods to set properties of PythonQt from Python
177+
class PYTHONQT_EXPORT PythonQtConfigAPI : public QObject
178+
{
179+
Q_OBJECT
180+
public:
181+
PythonQtConfigAPI(QObject* parent):QObject(parent) {};
182+
183+
public slots:
184+
//! Set a callable that is used as the argument for the add_done_callback for the Task/Future
185+
//! created when, e.g., an async function is connected to signal.
186+
void setTaskDoneCallback(PyObject* object);
187+
};
188+
189+
176190
//! Some helper methods that allow testing of the ownership
177191
class PYTHONQT_EXPORT PythonQtDebugAPI : public QObject
178192
{

0 commit comments

Comments
 (0)