摘自:http://blog.csdn.net/lslxdx/article/details/7543793
但是我都照办了,还是不行!无奈之下,直接看这个h文件生成的moc_xxx.cpp文件了,凡是存在由Q_OBJECT标示过的class的h文件,都会由moc生成一个相应的moc_xxx.cpp的文件,其中xxx是你的h文件的名字,这个工作在VS2008和QtCreator中是自动完成的,但是依稀记得我的这个class在VS2008中的moc阶段出现过错误,也就是说,如果moc失败,那么新加到class中的slots就不会被编译到moc_xxx.cpp文件中,以至于这个slot明明在class中存在,但就是无法被QObject发现和使用,所以就报“QObject::connect: No such slot”错了。
注意,我这里的h文件的名字是toolwindow.h。
今天在改一个继承自QObject的class,这个class中自然要使用些slot,之前就使用了,今天又往里加了两个signal,编译通过,运行时报“Object::connect: No suchslot”错,当然可以继续运行,只是signal的connect没有成功,试着把之前的slotconnect到signal,正常工作,为什么我新添加的不能用呢?!
Google之,网上通用的解决方法是:
1、看看你的类声明中有没有Q_OBJECT
2、你声明的函数要加声明,就是说
[cpp]
view plain
copy
- private
slots: - void
xxxx();
但是我都照办了,还是不行!无奈之下,直接看这个h文件生成的moc_xxx.cpp文件了,凡是存在由Q_OBJECT标示过的class的h文件,都会由moc生成一个相应的moc_xxx.cpp的文件,其中xxx是你的h文件的名字,这个工作在VS2008和QtCreator中是自动完成的,但是依稀记得我的这个class在VS2008中的moc阶段出现过错误,也就是说,如果moc失败,那么新加到class中的slots就不会被编译到moc_xxx.cpp文件中,以至于这个slot明明在class中存在,但就是无法被QObject发现和使用,所以就报“QObject::connect: No such slot”错了。
解决方法:
1、删掉原有的moc_xxx.cpp,应该是在你项目的目录中,找找就行。
2、在定义这个类的h文件上右键=》编译,这时候会生成一个新的moc_xxx.cpp文件,打开这个文件,看看里面有没有你新添加进去的那个slot,如果没有,说明VS在moc的时候出错了,应该自定义moc:
[plain]
view plain
copy
- 在VS的toolwindow.h解决方案窗口,找到toolwindow.h,右键,属性,配置属性,自定义生成步骤,常规,按如下命令填写:
- 命令行
moc.exe toolwindow.h -o moc_toolwindow.cpp - 输出
moc_toolwindow.cpp - 附加依赖项
moc.exe toolwindow.h
注意,我这里的h文件的名字是toolwindow.h。
世界再次充满了阳光~