2017-02-10 12 views
2

я подключаю лямбды к сигналам QObject «s:Как передать Qt :: ConnectionType в QObject :: connect при подключении лямбда?

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

Код выше компилируется без проблем.

Однако абсолютно необходимо, чтобы Qt::QueuedConnection, потому что объект handle в конечном итоге переместится в другой поток.

Я добавил это в мой код:

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

как я добавил явное приведение сделать уведомление, что он идентифицирует тип значения правильно. Результат:

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 

Как получить соединение в очереди при подключении лямбда?

+0

Я думал, что это будет обман, так как требование для целевого контекста делает его немного неинтуитивным, но, по-видимому, нет. –

ответ

6

Я думаю, вам нужно использовать QObject::connect overload, что позволяет определить контекст, в котором лямбда должна быть вызвана ...

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

очереди соединение не может работать без контекста объекта-мишени, так как этот контекст выбирает очередь, в которую вставлен звонок слота. To be more obtusely, a QMetaCallEvent обертка функтора отправляется в объект контекста thread().

 Смежные вопросы

  • Нет связанных вопросов^_^