一、问题说明
对象子类化过程中,或者新添加的类对象,当你需要使用信号槽机制的时候,那么,你就必须加上Q_OBJECT宏变量:
问题来了,你的这个类就必须继承与QObejct类,同时集成于你的积累,如QWidget或者QFrame。
那么,又有新的问题,继承关系必须拟清楚,QFrame集成于QWidget,QWidget继承于QObejct。
例子:
ERROR:iray_menubar_item.cpp:7: error: undefined reference to `vtable for IRAYMenuBarItem'
".h"
class IRAYMenuBarItem : public QObject, public QFrame{
Q_OBJECT
public:
IRAYMenuBarItem(QWidget* parent, QString filepath, QString ItemName);
virtual ~IRAYMenuBarItem();
...
}
".cpp"
IRAYMenuBarItem::IRAYMenuBarItem(QWidget* parent, QString filepath, QString ItemName)
:QObject(parent)
{
...
connect(pb, SIGNAL(click()), this, SLOT(onLButtonClicked()));
}
二、问题分析解决
上面就显得多余,而且继承关系错乱。
".h"
class IRAYMenuBarItem : public QFrame{
Q_OBJECT
public:
IRAYMenuBarItem(QWidget* parent, QString filepath, QString ItemName);
~IRAYMenuBarItem();
...
}
".cpp"
IRAYMenuBarItem::IRAYMenuBarItem(QWidget* parent, QString filepath, QString ItemName)
:QFrame(parent)
{
...
connect(pb, SIGNAL(click()), this, SLOT(onLButtonClicked()));
}
三、问题深度剖析
1、 Q_OBJECT纵使需要当前类继承QObject类,但是QFrame类是继承QWidget的,QWidget继承QObject,所以这里只需要继承QFrame就可以了,简单易读。
2、同时,使用Qt Creator,你还必须重新qmake,并且Rebuild All。
3、当你的父类(自己实现的父类),有一个继承的子类,父类又有自己写的虚拟函数,那么子类继承,必须有虚拟析构函数。
我这里不是继承的自己实现的父类,继承现有QFrame原有类,是不需要多此一举使用虚拟析构函数的。