2017-02-10 10 views
2

Je me connecte lambdas aux signaux de QObject:Comment passer Qt :: ConnectionType à QObject :: connect lors de la connexion d'un lambda?

QObject::connect(handle, &BatchHandle::progressMax, [this](const ProcessHandle* const self, const int value) { 
     this->maxProgress(value); 
    }); 

Le code ci-dessus compile sans problème.

Cependant, il est absolument nécessaire que le Qt::QueuedConnection car l'objet handle finira par passer à un autre thread.

j'ai ajouté à mon code:

QObject::connect(handle, &BatchHandle::finished, [this](const ProcessHandle* const self) { 
     this->processIsRunning(false); 
    }, (Qt::ConnectionType)Qt::QueuedConnection); 

Remarquez que j'ai ajouté transtypage explicite pour vous assurer qu'il identifie correctement le type de valeur. Résultat:

1>src\TechAdminServices\database\techCore\processes\import\ImportManagerDialog.cpp(191): error C2664: 'QMetaObject::Connection QObject::connect<void(__cdecl taservices::ProcessHandle::*)(const taservices::ProcessHandle *),Qt::ConnectionType>(const taservices::ProcessHandle *,Func1,const QObject *,Func2,Qt::ConnectionType)' : cannot convert parameter 3 from 'taservices::`anonymous-namespace'::<lambda58>' to 'const QObject *' 
1>   with 
1>   [ 
1>    Func1=void (__cdecl taservices::ProcessHandle::*)(const taservices::ProcessHandle *), 
1>    Func2=Qt::ConnectionType 
1>   ] 
1>   No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 

Comment obtenir une connexion en file d'attente lors de la connexion d'un lambda?

+0

Je pensais à coup sûr que ce serait une dupe, puisque l'exigence du contexte cible le rend un peu inintéressant, mais apparemment pas. –

Répondre

6

Je pense que vous devez utiliser le QObject::connect overload qui vous permet de spécifier le contexte dans lequel le lambda doit être invoquée ...

QObject::connect(
    handle, 
    &BatchHandle::progressMax, 
    target_context, /* Target context parameter. */ 
    [this](const ProcessHandle* const self, const int value) 
    { 
    this->maxProgress(value); 
    }, 
    Qt::QueuedConnection); 
0

La connexion ne peut pas en file d'attente travailler sans le contexte de l'objet cible, depuis c'est ce contexte qui sélectionne la file d'attente dans laquelle l'appel de slot est inséré. To be more obtusely, un QMetaCallEvent enveloppant le foncteur est envoyé à la file d'attente d'événements thread() de l'objet de contexte.