Qt 이야기: .cpp 안에서 QObject 자식 클래스 사용하기
Qt 에서 새로운 클래스를 만들 때, 보통은 .h 와 .cpp 를 구분해서 작성한다. 그런데 때로는 .cpp 자체에서 클래스를 만들어 쓰고 싶을 때가 있다. 만약 그 클래스가 QObject 를 상속한 클래스가 아니라면 상관이 없지만, QObject 를 상속하고 Q_OBJECT 를 포함하고 있다면, 링크가 되지 않는다. 예를 들어, class CppClass : public QObject { Q_OBJECT }; CppClass c ; 이 경우에, Issues 패널에 다음과 같은 에러 메세지가 나타난다. In function `ZN8CppClassC1Ev': undefined reference to `vtable for CppClass' undefined reference to `vtable for CppClass' ld returned 1 exit status 이는 .h 의 경우 qmake 가 알아서 처리를 해주지만, .cpp 의 경우 그렇지 않기 때문이다. 이를 해결하려면, qmake 가 .moc 파일을 생성하도록 알려주면 된다. 방법은 간단하다. 필요한 .moc 파일을 .cpp 에 포함시키면 된다. 예를 들어, 위 코드의 파일 이름이 cppclass.cpp 라면, cppclass.moc 파일을 포함시키면 된다. 다만 cppclass.moc 파일은 CppClass 의 선언 이후에 이후에 위치해야 한다. 코드 중간에 위치 하는 것이 마음에 들지 않는다면, 파일의 제일 마지막에 추가하면 된다. 위 코드는 다음과 같이 쓰여져야 한다. class CppClass : public QObject { Q_OBJECT }; #include "cppclass.moc" CppClass c ; 그런데 이게 끝이 아니다. qmake 에게 알려주어야 한다. 파일을 저장한 후, qmake([Build] - [Run qmake]) 를