Qt连接功能 - 使用lambdas信号消歧

时间:2014-09-26 14:50:36

标签: c++ qt c++11 lambda

我正在使用c ++ 11连接语法,并使用此连接语句获得以下错误:

connect(fileSystemCompleter, &QCompleter::activated, [&] (QModelIndex index)
{
    fileSystemPathEdit->setFocus(Qt::PopupFocusReason);
});

错误:

error C2664: 'QMetaObject::Connection QObject::connect(const QObject *,const char *,const char *,Qt::ConnectionType) const' : cannot convert parameter 2 from 'overloaded-function' to 'const char *'
Context does not allow for disambiguation of overloaded function

是否有可能以某种方式重写它,以便编译器能够消除重载函数的歧义?

编辑:

来自Qt Project ...

  

过载

     

正如您在示例中看到的那样,连接到QAbstractSocket :: error   因为错误有一个超载,并采取了   重载函数的地址需要显式转换。

     

某些宏可以提供帮助(使用c ++ 11或类型扩展)

     

最好的事情可能是建议不要过载信号或   插槽...

     

...但我们在过去的Qt版本中添加了重载   因为获取函数的地址不是我们的用例   支持。但是现在如果不打破源头就不可能做到这一点   兼容性。

任何想法究竟这个宏会是什么样子?或者如何进行显式投射?

1 个答案:

答案 0 :(得分:8)

您必须显式转换重载指针:

void (QCompleter::* activatedOverloadPtr)(const QModelIndex&) = &QCompleter::activated;
connect(fileSystemCompleter, activatedOverloadPtr, [&] (QModelIndex index)
{
    fileSystemPathEdit->setFocus(Qt::PopupFocusReason);
});