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
не запускается на ваших файлах, или его результат не становится связанным.
Золотые правила:
- Убедитесь, что
Q_OBJECT
макрос присутствует в определении всехQObject
классы - Убедитесь, что вы объявите
QObject
классы только в ваших заголовочных файлах. - Убедитесь, что все ваши заголовочные файлы перечислены в вашем.pro-файле в
HEADERS=
список. - Бежать
qmake
каждый раз, когда вы добавляетеQ_OBJECT
к одному из ваших классов или изменить ваш.pro
файл.
Приложение:
signals:
void ton() {};
Не вводите сигнал. moc
осуществит это для вас.
Не уверен насчет вашего компилятора.
Убедитесь, что мета-компилятор Qt запущен для заголовочного файла, в котором определен класс Msnger. И полученный файл moc_* cpp компилируется вашим компилятором.
PS. Хорошо, когда имена наследуемых классов QObject начинаются с 'Q', например, QMsnger