Я унаследовал класс от QObject:
class Parent: public QObject
{
Q_OBJECT
QObject* cl;
public:
Parent(QObject *parent=0):QObject(parent) {
cl = NULL;
}
QObject* getCl() const {
return cl;
}
void setCl(QObject *obj) {
cl = obj;
}
};
Но когда я пишу:
Parent ev;
Я получаю следующую ошибку:
main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Parent::metaObject(void)const " (?metaObject@Parent@@UBEPBUQMetaObject@@XZ)
main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual void * __thiscall Parent::qt_metacast(char const *)" (?qt_metacast@Parent@@UAEPAXPBD@Z)
main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual int __thiscall Parent::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Parent@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
Вы должны удалить debug
папку вашего приложения и запустите его снова, чтобы исправить эту проблему.
Если вы используете Visual Studio, удалите строку Q_OBJECT
из заголовочного файла, сохраните файл, положите Q_OBJECT
обратно в заголовочный файл, сохраните файл еще раз. Это должно генерировать moc_*
файл и должен построить и связать правильно.
Я заметил, что некоторые ответы основаны на Visual Studio.
Этот ответ основан на Qt Creator.
В отличие от названия предполагают, Rebuild Project
не буду все уничтожать и строить с нуля. Если вы недавно добавили QObject
(и / или Q_OBJECT) для вашего класса, вам придется запустить qmake
опять, например
Это потому, что по умолчанию qmake
запускается только тогда, когда вы вносите значительные изменения в свое решение, например добавляете новые исходные файлы или изменяете .pro
файл. Если вы вносите изменения в существующий файл, он не знает, что нужно запустить qmake
,
В качестве отступления, чтобы заставить Qt собрать все с нуля, удалите Debug
или же Release
папка.
Поэтому проблема была в том, что мне нужен компилятор Qt MOC для компиляции моего файла .h. Это необходимо для любых классов, расширяющих QObject или одного из его дочерних классов. Исправление вызвало (для меня) щелчок правой кнопкой мыши по файлу заголовка, выбрав «Свойства» и установив «Тип элемента» «Вход Qt MOC», затем нажав «Компилировать» в заголовке, а затем добавив полученный файл moc_myfilename.cpp в мой файл. проект.
Если ваши файлы moc сгенерированы в проекте Visual Studio, попробуйте включить их в проект, если они не включены в проект, а затем пересоберите.
У меня была та же проблема в Visual Studio, и я решил ее, выполнив следующие шаги:
Затем в конфигурации Custom Build Tool:
установите «Командную строку» на:
«$ (QTDIR) \ bin \ moc.exe» «% (FullPath)» -o «. \ GeneratedFiles \ $ (ConfigurationName) \ moc _% (имя файла) .cpp» «-fStdAfx.h» «-f ../ ../../src/FileName.h«-DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DWIN32_LEAN_AND_MEAN -DDIS_VERSION = 7 -D_MATH_DEFINES_DEFINED «-I \ SFML_STATIC» «-I \ GeneratedFiles.» «-I»».. — I $ (QTDIR) \ include «» -I. \ GeneratedFiles \ $ (ConfigurationName). «» -I $ (QTDIR) \ include \ QtCore «» -I $ (QTDIR) \ include \ QtGui «» -I $ ( QTDIR) \ включают \ QtNetwork»
установите «Выходы» на:
.\ GeneratedFiles \ $ (ConfigurationName) \ MOC _% (Имя файла) .cpp
установите «Дополнительные зависимости» на:
$ (QTDIR) \ Bin \ moc.exe;% (FullPath)
Ваши точные значения могут отличаться. Они обычно применяются через плагин Qt.
Я использую CMake для управления проектами Qt, и новый вызов Q_OBJECT необходимо добавить в вызов QT4_WRAP_CPP. Это сгенерирует moc _ *. Cxx для включения в проект и очистит неразрешенные внешние компоненты.
У меня была эта проблема с Visual Studio 2012, когда в моем файле cpp было определение класса Q_OBJECT. Перемещение определения класса в заголовочный файл решило проблему.
Похоже, что должна быть возможность поддерживать класс Q_OBJECT в файле cpp, добавив файл cpp в moc, но я этого не пробовал.