неопределенная ошибка компоновщика ссылок с сигналами и слотами

Используя Qt Creator, я создаю класс с настраиваемыми слотами в Qt:


class CustomEdit : public QTextEdit
{
    Q_OBJECT

public:
    CustomEdit(QWidget* parent);

public slots:
    void onTextChanged ();
};

Однако я получаю эту ошибку компоновщика:

undefined reference to 'vtable for CustomEdit'

В документации говорится:

если вы получаете ошибки компилятора в строках «неопределенная ссылка на vtable для LcdNumber», вы, вероятно, забыли запустить moc или включить вывод moc в команду ссылки.

... но не совсем понятно, что это значит.

Есть ли что-то, что мне нужно добавить в свой класс или в файл .pro?

ИЗМЕНИТЬ. Вот мой файл .pro:

QT += network \
    script \
    webkit \
    xml
TARGET = MyApp
TEMPLATE = app
SOURCES += main.cpp \
    MainWindow.cpp \
    CustomEdit.cpp 
HEADERS += MainWindow.h \
    CustomEdit.h
FORMS += mainwindow.ui

РЕДАКТИРОВАТЬ:

Этот вопрос касается тех же проблем, но ответы не проясняют, как я могу исправить эту проблему в Qt Creator. Нужно ли мне явно добавлять сгенерированный moc файл .cpp в мой список файлов, которые нужно связать? Это похоже на боль.


person Tony the Pony    schedule 10.06.2010    source источник
comment
Вы пробовали искать в ТАК? ;-) stackoverflow.com/questions/1552069/   -  person Jujjuru    schedule 10.06.2010
comment
Спасибо, но я не использую qmake, я использую Qt Creator   -  person Tony the Pony    schedule 10.06.2010
comment
Просто для информации, я напортачил, пропустив некоторые .h в SOURCES вместо HEADERS, и это генерирует такую ​​же ошибку.   -  person n0p    schedule 05.08.2020


Ответы (1)


Создатель Qt - это IDE, которая используется для создания ваших проектов Qt. Это все. Но qmake позволяет вам строить проект. Из руководства по qmake,

qmake автоматизирует создание Make-файлов, поэтому для создания каждого Make-файла требуется всего несколько строк информации. qmake генерирует Makefile на основе информации в файле проекта. qmake содержит дополнительные функции для поддержки разработки с использованием Qt, включая автоматическое включение правил сборки для moc и uic.

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

Теперь, чтобы запустить qmake в создателе Qt, просто перейдите к Build->RebuildAll, который запустит qmake, и все файлы (moc) будут сгенерированы и связаны (в Makefile.debug).

Надеюсь, это устранит вашу неопределенную ссылку.

person liaK    schedule 10.06.2010
comment
Да, спасибо. Я также понял, что когда я создаю новый класс в Qt Creator, я должен указать Inherits QWidget в качестве информации о типе. Кажется странным, что мне пришлось бы указать это явно, учитывая, что я уже сказал IDE, что мой класс является производным от класса Qt, но это помогает. - person Tony the Pony; 11.06.2010