Qt неопределенная ссылка на `vtable для Msnger'

Я получаю эту ошибку

/.../mainwindow.o:-1: In function `MainWindow::MainWindow(QWidget*)':
/.../mainwindow.cpp:-1: Chyba:undefined reference to `vtable for Msnger'

и я не понимаю почему. Единственными проблемами, которые я обнаружил, вызвавшими это сообщение, является объявление без определения, и я не вижу ничего из этого в моем коде.

вот класс Msnger msnger.h:

#include <QObject>

class Msnger : public QObject
{
    Q_OBJECT

public:
    Msnger() {};
    ~Msnger() {};
    void sendOn();
signals:
    void ton() {};
};

msnger.cpp:

#include "msnger.h"

void Msnger::sendOn()
{
    emit ton();
}

Msnger должен отправить сообщение в мое главное окно

в конструкторе mainWindow:

msn = new Msnger();
connect(msn, SIGNAL(ton()),this, SLOT(on()));

где MSN это:

public: Msnger * msn

Можете ли вы объяснить мне, что вызывает это и как я могу это исправить?

2 ответа

Решение

Ваша проблема в том, что moc не запускается на ваших файлах, или его результат не становится связанным.

Золотые правила:

  1. Убедитесь, что Q_OBJECT макрос присутствует в определении всех QObject классы
  2. Убедитесь, что вы объявите QObject классы только в ваших заголовочных файлах.
  3. Убедитесь, что все ваши заголовочные файлы перечислены в вашем.pro-файле в HEADERS= список.
  4. Бежать qmake каждый раз, когда вы добавляете Q_OBJECT к одному из ваших классов или изменить ваш .pro файл.

Приложение:

signals:
    void ton() {};

Не вводите сигнал. moc осуществит это для вас.

Не уверен насчет вашего компилятора.

Убедитесь, что мета-компилятор Qt запущен для заголовочного файла, в котором определен класс Msnger. И полученный файл moc_* cpp компилируется вашим компилятором.

PS. Хорошо, когда имена наследуемых классов QObject начинаются с 'Q', например, QMsnger

Другие вопросы по тегам