继承自QPushButton的子类提示说虚函数未定义



```#include "mainwindow.h"
#include <QApplication>
#include<QtWidgets>
#include<iostream>
using namespace std;

class B:public QPushButton
{
    Q_OBJECT
public: B(QString s="",QWidget *p=0):QPushButton(s,p){}
    ~B(){}
public slots:
    void  f(){cout<<"F"<<endl;}
    void g(){ cout<<"G"<<endl;}
    void h(){ cout<<"H"<<endl;}
    void j(){ cout<<"J"<<endl;}
    void k(){ cout<<"K"<<endl;}
};

int main(int argc, char *argv[])
{
    QApplication a(argc,argv);

    //创建部件
    QDialog w; //默认按钮只在对话框中有效。读者可使用 QWidget 进行验证。
    B *pb1=new B("AAA",&w); B *pb2=new B("BBB",&w); B *pb3=new B("CCC",&w);
    B *pb4=new B("DDD",&w); B *pb5=new B("EEE",&w);
    QCheckBox *pb6=new QCheckBox("XXX",&w);
    pb2->setDefault(true); //设置 pb2 为默认按钮。
    pb3->setAutoDefault(0); //取消 pb3 的自动默认按钮属性
    pb4->setFlat(true); //设置 pb4 的 flat 属性为 true。
    // pb5->setAutoDefault(0); //错误 pb5 不是 QPushButton,不能设置自动默认按钮
    cout<<pb1->autoDefault()<<endl; //输出 1。对话框中的按钮默认具有自动默认按钮属性
    cout<<pb1->isDefault()<<endl; //输出 0。
    //布局各部件
    pb1->move(22,22); pb2->move(99,22); pb3->move(177,22);
    pb4->move(22,77); pb5->move(99,77);pb6->move(177,77);
    //验证默认按钮和自动默认按钮,需要使用信号和槽机制。
    QObject::connect(pb1,&QPushButton::clicked,pb1,&B::f);
    QObject::connect(pb2,&QPushButton::clicked,pb2,&B::g);
    QObject::connect(pb3,&QPushButton::clicked,pb3,&B::h);
    QObject::connect(pb4,&QPushButton::clicked,pb4,&B::j);
    QObject::connect(pb5,&QPushButton::clicked,pb5,&B::k);
    w.resize(300,200); w.show();
    return a.exec();
}



```

error: undefined reference to `vtable for B'

应该是classB没有生成对应的moc文件。
或者构建的工程有缓存,没有清除掉旧的信息,彻底弄干净再来构建

加了Q_OBJECT的QObject子类要想正常moc,建议单独定义在.h文件里并加入项目