QT를 이용하여, 개발을 하다 보면 자주 만나는 메시지다. QVariant와 같은 QT에 미리 지정된 템플릿 클래스를 이용하다 보면 위와 같은 에러 메시지를 종 종 볼 수 있는데, 사용자 정의 클래스/타입이 미리 선언되어있지 않아 발생하는 오류다. enum ENUM_TYPE { ENUM_1, ENUM_2 } QVariant v; v.value(); // 에러 이는 헤더 파일에 Q_DECLARE_METATYPE(TypeName) 과 같이 작성하면 해당 문제는 해결된다. enum ENUM_TYPE { ENUM_1, ENUM_2 } Q_DECLARE_METATYPE(FSStatus); QVariant v; v.value();
개요 QT C++로 프로그램을 작성하면, 타 라이브러리와의 연동을 위해 std::string 을 QString으로 변환하거나, 그 반대를 수행해야 하는 경우가 잦다. 이를 해결하기 위한 방법은 다음과 같다. std::string -> QString QString의 함수 이용 QString은 std::string을 QString으로 변환해주는 함수 QString::fromStdString 함수를 제공한다 사용 예시 std::string str ="Hello, World!"; QString qstr = QString::fromStdString(str); 위의 방법을 사용하면 손쉽게 형 변환이 가능하다. string pointer 이용 std::string을 QString으로 변경하기 위한, char 배열로 ..
Error 발생 원인 enum class를 선언하고, 공통 헤더에서 prototype만 정의하려는 시도를 진행하였으나, 제목과 같은 에러가 발생하였다. 이러한 현상은 enum class의 구현부의 underlying type과 prototype의 underlying type이 서로 달라 발생하는 오류이다. 예제 코드 global.h enum class Type; enumclass.h #include "global.h" enum class Type : unsigned int { A, B, C } 위와 같이 global.h에는 별다른 type을 지정안했으나, enumclass.h에는 별도의 타입이 지정되어 있을 때 발생한다. 해결 방법 이러한 부분은 아래와 같이 타입을 지정해주면 해결 된다. 예제 코드 gl..
C++에서 접근제어 지정자를 잘못 지정해서 발생하는 현상이다. 아래와 같이 업캐스팅으로 부모 클래스의 자료형으로 자식 클래스의 포인터를 가리키려 할 때, 이와 같은 현상이 발생한다. class A { } class B : A { } A* obj = new B(); 이와 같은 문제는, 접근제어 지정자를 변경함으로서 해결 가능하다. class A { } class B : public A { } A* obj = new B();
QT 개발을 하던 도중, 특정 클래스를 인자로 사용하는 signal/slot을 생성하고, Connect를 할 경우 QObject::connect: Cannot queue arguments of type 'Type Name' 메시지가 출력될 때가 있다. 이러한 부분은, QT에 해당 class의 meta type이 추가되지 않아 발생하는 현상으로, 아래와 같은 코드를 추가하여 해결할 수 있다. qRegisterMetaType("CMultiTrackMini");