• 做一个幸福的人,读书,旅行,努力工作,关心身体和心情。
  • 不管有没有人爱,也要努力做一个可爱的人。不埋怨谁,不嘲笑谁,也不羡慕谁,阳光下灿烂,风雨中奔跑,做自己的梦,走自己的路。

QObject::connect: No such slot 解决办法

Qt lcq 4年前 (2015-04-25) 1028次浏览 0个评论

前几天在测试项目中的一些函数的时候,(在Visual Studio 2013情况下,QtCreator不一样)遇到一个这样的编译警告:QObject::connect: No such slot IComponet::TgwSubHangqingReceive(int, unsigned long, unsigned long, QByteArray)。很明显,是说找不到这样的槽函数。当时,说实在的呢,我认为别人在提供接口函数的时候出了问题呢。因为当时我仿佛检查了我写的代码,我明明写了TgwSubHangqingReceive这个槽函数啊,明明我在TgwSubHangqingReceive这个函数上面加了个slots声明他是槽函数啊,也没有将TgwSubHangqingReceive这个槽函数写错啊。甚至当初我还在想是不是将slots声明成private有问题呢。

当然最后都不是我上面想到的,是因为我没在我的类里面写上Q_OBJEC这个关键字。写过Qt的人都知道,只有加入了Q_OBJECT,你才能使用QT中的signal和slot机制。问题解决了,稍微总结一下以后当遇到说找不到槽函数的解决办法(其实写到这里基本都已经说完了)。

1、找一下类里面是否写了Q_OBJEC。在Visual Studio里面是报QObject::connect: No such slot…..但是在QtCreator里面就报的很详细了,是说:Class declaration lacks Q_OBJECT macro.尼玛QtCreator跟Visual Studio比起来完全是一针见血啊。Visual Studio感觉有种藏着掖着的意思。

2、如果使用Qt4.8之前的槽写法,即使用QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection)这种方式的写法。如果你发现槽函数不起作用,那么你要看一下是否在槽函数的声明处写了slots关键字,是否在connect处将SLOT写成了SIGNAL,当然,由于Qt4.8之前的SLOT后面传的是const char*,你还需要检查一下槽函数是否写错了。比如,你将book()函数写成了bo0k()函数(即将o写成了0)。

基于上面第2点,所以我强烈大家使用Qt4.8之后的槽函数的写法,即使用QObject::connect(const QObject * sender, const QMetaMethod & signal, const QObject * receiver, const QMetaMethod & method, Qt::ConnectionType type = Qt::AutoConnection)这种写法。使用这种写法,我发现在槽函数面前就算不使用slots关键字也是能正常工作的(但我不推荐这么做啊,影响代码的可读性)。使用这种写法,编译器在编译的时候就能排除掉函数写错的情况。比如:如果槽函数book()你使用connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(bo0k()));是不会有编译错误的,只是真正的槽函数你就没法调用到了。但是你写成connect(ui.pushButton, &QPushButton::clicked, this, &HelloQt::bo0k);编译器立马说会找不到bo0k这个函数。

参考资料:

1、QT编程No such slot的解决方法


乐趣公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明QObject::connect: No such slot 解决办法
喜欢 (1)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址