Макрос C ++ / Qt Q_OBJECT вызывает ошибку - PullRequest
4 голосов
/ 29 марта 2012

Я только начал программировать в среде Qt.Ниже приведена очень простая программа:

#include <QtCore/QCoreApplication>
#include <QDebug>

class MyClass : public QObject
 {
     Q_OBJECT

 public:
     MyClass() {}
 };

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    MyClass *c = new MyClass();
    return a.exec();
}

Но я получаю следующую ошибку, когда пытаюсь скомпилировать и запустить ее:В функции MyClass:неопределенная ссылка на vtable for MyClassНо когда я удаляю макрос QObject , все работает нормально.Обратите внимание, что класс определен в том же файле, что и основная функция.Я использую Qt версии 4.7, работающую на Win 7.Что вызывает эту проблему?

Обновление: Я получаю ту же ошибку, когда определяю свой класс в отдельном заголовочном файле.mytimer.h:

#ifndef MYTIMER_H
#define MYTIMER_H
#include <QtCore>

class MyTimer : public QObject
{
    Q_OBJECT

public:
    QTimer *timer;
    MyTimer();
public slots:
    void DisplayMessage();
};


#endif // MYTIMER_H

mytimer.cpp:

#include "mytimer.h"
#include <QtCore>

MyTimer::MyTimer()
{
    timer = new QTimer();
    connect(timer,SIGNAL(timeout()),this,SLOT(DisplayMessage()));

    timer->start(1000);
}

void MyTimer::DisplayMessage()
{
    qDebug() << "timed out";
}

И это main.cpp:

#include <QtCore/QCoreApplication>
#include <QDebug>
#include "mytimer.h"


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    MyTimer *mt = new MyTimer();
    return a.exec();
}

Ответы [ 3 ]

4 голосов
/ 29 марта 2012

Вам нужно скомпилировать его, используя qmake, который собирается создать фиктивные методы для вашего пользовательского класса QObject.См. здесь , чтобы узнать больше о генерации moc-файлов.

Поскольку ваш пример не содержит заголовочных файлов, он не анализируется, и moc-файлы не создаются.Вам необходимо объявить MyClass в отдельном заголовочном файле и запустить инструмент генерации moc.

1 голос
/ 30 марта 2012

Всякий раз, когда вы применяете некоторые изменения, сначала очистите ваш проект, затем запустите qmake, и, наконец, соберите свой проект ...

1 голос
/ 29 марта 2012

Когда вы используете QT Creator, вы должны очистить свой проект и выполнить qmake в меню сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...