如何在连接lambda时将Qt :: ConnectionType传递给QObject :: connect?

12

我正在将Lambda表达式连接到QObject的信号:

    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

如何在连接Lambda时获取排队的连接?


我本以为这个会是一个重复的问题,因为目标上下文的要求确实让它有点不直观,但显然并非如此。 - Nicolas Holthaus
2个回答

21

我认为您需要使用QObject::connect函数的一种重载形式,该形式允许您指定在哪个上下文中调用lambda表达式...

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

-1

排队连接在没有目标对象上下文的情况下无法工作,因为正是这个上下文选择了插入槽调用的队列。更加晦涩的说法,请参见此处,一个包装函数对象的QMetaCallEvent被发布到上下文对象thread()的事件队列中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接