关于demo.cpp:(.text.startup+0x8f): undefined reference to `vtable for SlotObject’ ,问题探究
1、在学习信号和槽的过程中使用了一个小例子,编辑完成之后,却出现了编译报错(标题中提到的)。于是采用了临时的解决办法,将Q_OBJECT注释,信号函数 也被我增加了一定义体。 这样可以顺利的编译,并可以运行。但是之后又遇到了新的问题。
#include <QObject>
#include <QApplication>
class SigObject:public QObject
{
//Q_OBJECT //如果包含,会有问题
signals:
void sigvoid(){} //不知道是不是版本的问题导致的,还是没有分文件导致的
void sigint(int i){}
public:
SigObject(QObject* parent = 0)
:QObject(parent){}
void sendVoid(){emit sigvoid();} //emit 宏 调用函数
void sendInt(int i){emit sigint(i);}
virtual ~SigObject(){}
};
int main(int argc,char** argv)
{
QApplication app(argc,argv);
SigObject sigObj;
sigObj.sendVoid();
sigObj.sendInt(5);
return app.exec();
}
又在上述的程序基础上,增加了槽的类的定义。编译遇到同样的问题。
于是我又 偷懒,按照上面的处理办法使整个程序可以顺利编译。但是等到运行之后,程序提示无法连接(connect)信号。
于是我就懵逼了。百度之后,试了很多大神的方法。最终明白了,确实是编译器的一个bug问题。按照大神的提示:1、将工程目录下的文件(除了H和CPP)全部删掉 2、重新qmake -project ,qmake ,make 3、成功
- 完善之后的程序如下:
/*sss.h*/
#ifndef SSS_HHH
#define SSS_HHH
#include <QObject>
class SigObject:public QObject
{
Q_OBJECT
public:
explicit SigObject(QObject* parent = 0);
//阻止不应该允许的经过转换构造函数进行的隐式转换的发生。
//声明为explicit的构造函数不能在隐式转换中使用。
~SigObject();
void sendVoid();
void sendInt(int i);
signals:
void sigVoid();
void sigInt(int i);
};
class SlotObject:public QObject
{
Q_OBJECT
public:
explicit SlotObject(QObject* parent = 0);
~SlotObject();
public slots:
void onSigVoid();
void onSigInt(int i);
};
#endif
/*sss.cpp*/
#include "sss.h"
#include <QObject>
#include <QDebug>
SigObject::SigObject(QObject* parent)
:QObject(parent)
{}
SigObject::~SigObject()
{}
void SigObject::sendVoid()
{emit sigVoid();}
void SigObject::sendInt(int i)
{emit sigInt(i);}
SlotObject::SlotObject(QObject* parent)
:QObject(parent)
{}
SlotObject::~SlotObject()
{}
void SlotObject::onSigVoid()
{
qDebug()<<"slotvoid()";
}
void SlotObject::onSigInt(int i)
{
qDebug()<<"slotint:"<<i;
}
/*demo.cpp*/
#include <QObject>
#include <QApplication>
#include "sss.h"
int main(int argc,char** argv)
{
QApplication app(argc,argv);
SigObject sigObj;
SlotObject slotObj;
QObject::connect(&sigObj,SIGNAL(sigVoid()),\
&slotObj,SLOT(onSigVoid()));
sigObj.sendVoid();
//sigObj.sendInt(5);
return app.exec();
}
心得:
可以多参考QT软件本身的工程程序。