qt - 未定义引用`vtable for myObj'在qt控制台应用程序 - 信号和插槽

时间:2017-01-25 02:58:05

标签: c++ qt signals-slots qobject

我需要捕获来自QProcess的发出信号以进行测试。

由于我使用的是控制台应用程序,因此我决定在main.cpp文件中创建一个名为myObj的文件,主要使用this example

#include <QCoreApplication>
#include <QLoggingCategory>
#include <QTextStream>
#include <QProcess>
#include <QString>
#include <QVariant>
#include <QDebug>
#include <QObject>

class myObj : public QObject
{

    Q_OBJECT

public:
    myObj(QObject *parent = 0);
//    virtual ~Communicate();
    ~myObj();

public slots:
    void registerFinished(int signal);
    void registerAboutToClose();
    void registerChannelReadyRead(int signal);
    void registerReadChannelFinished();
    void registerReadyRead();
    void registerReadyReadStandardOutput();
    void registerStarted();
};

myObj::myObj(QObject *parent)
    : QObject(parent)             <--- LINE 72 Error
{

}

//virtual myObj::~Communicate(){

//}

myObj::~myObj(){                  <--- LINE 81 Error

}

void myObj::registerFinished(int signal){
    qDebug() << "exit code = " << QString::number(signal);
}
void myObj::registerAboutToClose(){
    qDebug() << "aboutToClose";
}
void myObj::registerChannelReadyRead(int signal){
    qDebug() << "channelReadyRead = " << QString::number(signal);
}
void myObj::registerReadChannelFinished(){
    qDebug() << "readChannelFinished";
}
void myObj::registerReadyRead(){
    qDebug() << "exit code";
}
void myObj::registerReadyReadStandardOutput(){
    qDebug() << "exit code";
}
void myObj::registerStarted(){
    qDebug() << "started";
}

myObj *myO;

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

    myO = new myObj();

    //....
}

问题:

  

main.cpp:72:错误:未定义引用`vtable for myObj&#39;

     

main.cpp:81:错误:未定义引用`vtable for myObj&#39;

我查看过多个SO页面,例如herehere以及here以及其他各种页面,但尚未找到解决方案

我已经尝试过/已完成:

  • 添加了Q_Object宏
  • 跑qmake
  • 重建
  • 检查了#include

.pro文件

QT += core
QT -= gui

CONFIG += c++11

TARGET = serv_app
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

您有两种选择:

  • @eyllanesc解决方案确实有效。
  • #include "main.moc"功能之前或之后添加行main()

当您将类放入自己的头文件时,qmake将生成正确的moc文件。

但是,当您将该类放入.cpp文件时,除非您输入我之前说过的行,否则不会生成moc代码。

更新#1

Qt tutorial about writing a Unit Test中,我们可以找到以下信息:

  注意,如果我们的声明和执行都是我们的测试   class在.cpp文件中,我们还需要包含生成的moc   文件使Qt的内省工作。

所以这是我们需要包含moc文件的另一个例子。