1. 建立一个console工程
QT -= gui CONFIG += c++11 console CONFIG -= app_bundle # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += main.cpp baseclass.cpp subclass.cpp # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target HEADERS += baseclass.h subclass.h
2. 添加baseClass
baseclass.h
#ifndef BASECLASS_H #define BASECLASS_H #include "QObject" class baseClass: public QObject { Q_OBJECT public: baseClass(QObject * p = 0); virtual ~baseClass() {} signals: void signal1(); }; #endif // BASECLASS_H
baseClass.cpp
#include "baseclass.h" baseClass::baseClass(QObject * p) : QObject(p) { }
subclass.h
#ifndef SUBCLASS_H #define SUBCLASS_H #include "baseclass.h" class subClass: public baseClass { Q_OBJECT public: subClass(QObject * p = 0); virtual ~subClass() {}; //signals: void signal2(); }; #endif // SUBCLASS_H
subclass.cpp
#include "subclass.h" subClass::subClass(QObject * p) : baseClass (p) { }
main.cpp
#include <QCoreApplication> #include "subclass.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); subClass * sub = new subClass(); return a.exec(); }
编译报错:
testQtSignalBug/subclass.cpp:14: error: undefined reference to `vtable for subClass' collect2: error: ld returned 1 exit status
解决办法:注释掉subclass.h里的Q_OBJECT 宏
原因:未知