Qt,线程中发射信号的问题 undefined reference
在生产者消费者模型的线程类中发射signal,主线程接收到信号显示到界面,没想到构建时候会报错。。。去stackoverflow搜索下了也没有什么好的结果。。。各位看是什么原因
.h文件
#ifndef CENTERQTHREAD_H
#define CENTERQTHREAD_H
#include <QThread>
class centerThread : public QThread
{
public:
centerThread();
~centerThread();
void run();
void sendfunc(QString str);
signals:
void MsgSignal(const QString& tep);
void showMsg(int a);
public slots:
private:
int id;
};
#endif // CENTERQTHREAD_H
.cpp文件
#include "centerthread.h"
#include <QDebug>
#include <QWaitCondition>
#include <QMutex>
/*.....
省略若干不必要的代码
*/
void centerThread::sendfunc(QString str)
{
emit showMsg(2);
}
E:\source\QT\qt_test\\centerthread.cpp:58: error: undefined reference to `centerThread::showMsg(int)'
win 7 32bit
Qt版本:3.1.1
结果(已解决,过程如下):
最后解决了,参照一楼说的,qmake并没有报错,估计是编译连接的问题,我把emit语句写在函数里,直接在头文件里面定义里实现这个函数就没问题了。
1 千荒 · 16 分钟前
补充,然而事情还没有结束,每当我在run里调用的时候还是会报这个错误
2 千荒 · 刚刚
然而事情还是解决了,虽然不明白是怎么回事,但是,首先不要使用cpp文件,把实现全部写在头文件就可以了。也是参考官方QThread文档才找到的解决方法。
3 千荒 · 刚刚
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
确定代码没有问题的话,试试: build -> run qmake
cherrysd,的确发现了另外一个问题;但是如果没有宏的话,错误提示大多是:
error: Class declaration lacks Q_OBJECT macro.
首先你这个代码定义了信号,但是你并没有使用Q_OBJECT这个宏。
据我的一个不太权威的猜测:你直接run肯定是会报错的。因为如果你代码有这个宏,Qt是要在编译之前先额外处理一下,就是生成的MOC_xxxx.cpp这种东西。实际上,信号的实现应该在那里。如果你没有这个处理的话,没有这个文件,信号的函数自然是未定义的。想追本溯源的话,还是要看看那个处理机制是怎么回事。
因为我没有用过qmake所以并不是很清楚这个qmake是怎么运行的。但我想他应该会帮你生成MOC这种东西吧。
Q_OBJECT 添加上,再删除原来构建的文件夹,重新构建即可。