Qt5中QObject::connect()传参为lambda注意问题

在 Qt 5 中,QObject::connect()有五个重载:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
QMetaObject::Connection connect(const QObject *, const char *,
const QObject *, const char *,
Qt::ConnectionType);

QMetaObject::Connection connect(const QObject *, const QMetaMethod &,
const QObject *, const QMetaMethod &,
Qt::ConnectionType);

QMetaObject::Connection connect(const QObject *, const char *,
const char *,
Qt::ConnectionType) const;

QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
const QObject *, PointerToMemberFunction,
Qt::ConnectionType)

QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
Functor);

由于做界面窗口最大化按钮时,第一次点击最大化窗口,第二次还原为原大小窗口,因此需要自己写一个函数。而为了避免代码冗余,于是在connect传参时使用了lambda表达式,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
connect(ui->btn_group, &ButtonGroup::maxWindow, [=]()
{
static bool flag = false;
if(!flag)
{
this->showMaximized();
flag = true;
}
else
{
this->showNormal();
flag = false;
}
});

于是编译错误,提示

1
no matching function for call to (类名)::connect()……

看到这个错误,首先想到的是参数问题,由于connect()参数为四个,虽然lambda表达式默认可以省略this参数,但还是添加上试试

1
connect(ui->btn_group, &ButtonGroup::maxWindow, this, [=](){});

结果还是编译错误。后来上网查阅相关错误,结果大多数人的错误基本都是传参问题,但基本没有用lambda表达式的。于是删掉lambda表达式改用函数调用,结果编译通过。因此错误锁定在lambda表达式上。

后来发现,lambda表达式是C++11范畴,于是在pro文件当中添加以下代码:

1
CONFIG += c++11

编译通过。

因此Qt使用lambda表达式时,首先使用的编译器要支持要用的C++11 特性,其次,在.pro中加上 CONFIG += c++11


文章结束了,但我们的故事还在继续
坚持原创技术分享,您的支持将鼓励我继续创作!