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

0

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

/.../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

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

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

где msn:

public: Msnger * msn

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

  • 0
    Что такое "чиба"?
  • 0
    chyba - это чешское слово для ошибки.
Показать ещё 1 комментарий
Теги:
qt
vtable

2 ответа

5
Лучший ответ

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

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

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

Приложение:

signals:
    void ton() {};

Не используйте сигнал. moc выполнит его для вас.

  • 0
    Большой! THX qmake решил это. Я почувствовал, что есть проблема, и попытался пересобрать проект с помощью QT Creator. В следующий раз я сначала попробую qmake вручную.
  • 1
    В меню Build есть запись «Run qmake».
1

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

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

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

  • 0
    Где я могу проверить, «получен ли файл moc_ * cpp с моим компилятором»? Только файл moc_, сгенерированный в папке моего проекта, является moc_mainWindow.cpp. Это правильно или там тоже должен быть moc_msnger.cpp?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню