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

Nic*_*aus 5 c++ lambda qt c++11

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

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

错误:

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
Run Code Online (Sandbox Code Playgroud)

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

编辑:

从Qt项目......

超载

正如您在示例中看到的那样,连接到QAbstractSocket :: error并不是很漂亮,因为错误有重载,并且获取重载函数的地址需要显式转换.

一些宏可以帮助(使用c ++ 11或typeof扩展)

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

...但是我们在过去的Qt次要版本中添加了重载,因为获取函数的地址不是我们支持的用例.但是,如果不打破源兼容性,这将是不可能的.

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

cma*_*t85 8

你必须显式地转换重载指针:

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