QT 프로젝트를 빌드하다보면 가장 많이 보게 되는 오류인데, 원인은 여러가지가 있다. 라이브러리 호출 경로가 제대로 되어있지 않았다던지, 함수 선언 부분에 문제가 있다던지.


이번 문제의 원인은 외부 라이브러리 호출 시 컴파일러와 라이브러리 간의 비트(x86, x64)가 일치하지 않았기 때문이다. 외부 라이브러리 경로를 x64로 설정해주니 빌드가 잘 된다.



이번에 qt creator를 업그레이드 하면서 어디선가 설정이 바뀌었나보다. 회사에서 굳이 개발 프로그램 업데이트를 하지 않으려는지 알 것 같다.

'QT' 카테고리의 다른 글

QTableView edit이 되지 않을 때  (3) 2018.05.23
Qt LNK 2019 에러  (1) 2018.04.30
Class hierarchy와 Object hierarchy  (0) 2018.04.04
Q_OBJECT 란  (1) 2018.02.28
블로그 이미지

NCookie

,

사실 블로그에 올릴 정도의 내용이 아니기는 한데, 회사 코드를 그대로 가져다 사용하려다보니 생긴 문제라 일단 적어본다.


Qt에서는 데이터 관리와 표현을 위해 view, model 프로그래밍 방법을 사용한다. 자세한 내용은 [Qt Model/View 프로그래밍 #1. Model, View, Delegate]을 참고하자.


보통 view의 생성자에서 edit trigger를 설정하는데, 나 같은 경우는 이 부분이 문제가 없는데도 수정이 되지 않았다. 그것 때문에 끙끙 알면서 시간을 꽤 날렸는데, 엄청 간단하게 해결했다.


model 클래스에 flags라는 함수가 있는데 인자로 주어진 인덱스에게 item flag를 리턴한다. 그리고 재사용했던 회사 코드는 index.row() == 0일 때 edit이 되지 않도록 설정하고 있었다(...) 그러니까 안 되지.


코드에서는 테스트를 위해 기본적으로 하나의 row만 추가한 상태였고, 당연히 그 row는 edit이 되지 않는다. 다음부터는 코드를 외부에서 가져올 때 이런 설정 부분은 꼼꼼하게 봐야할 것 같다.



참고


Can't edit my QTableView cells

'QT' 카테고리의 다른 글

LNK2019 외부 기호 참조 위치 함수 에서 확인 하지 못했습니다  (0) 2019.01.28
Qt LNK 2019 에러  (1) 2018.04.30
Class hierarchy와 Object hierarchy  (0) 2018.04.04
Q_OBJECT 란  (1) 2018.02.28
블로그 이미지

NCookie

,

Qt LNK 2019 에러

QT 2018. 4. 30. 17:58

난 병신이다...


Qt 프로그램을 컴파일하다가 LNK2019 에러가 발생하면 보통 include 헤더를 놓친 것이 있거나 clean - run qmake - rebuild 를 해주면 해결된다고 한다.


그런데 난 몇 번을 확인하고 다시 해봐도 안 되서 멘탈이 나가있었다. 그러다가 다시 보니 오류가 나는 부분들은 slot만 해당되는 것이었고 나는 slot을 헤더에 선언만 해놓고 구현을 하지 않고 있었다.


하... 아무리 qt creator에서 이 부분을 지원해주지 않는다고 하지만 나 스스로가 너무 한심해졌다.


명심하자. qt에서 signal은 구현하지 않아도 되지만 slot은 선언했다면 꼭 implement 해줘야 한다. 안 그럼 LNK2019 에러를 보게 된다.

블로그 이미지

NCookie

,

처음에 object hierarchy라는 단어를 들었을 때에는 어리둥절했다. class hierarchy는 클래스 간의 상속 관계라는 것은 짐작할 수 있었지만, object는 어떤 것인지 감이 잘 잡히지 않았기 때문이다.



알아보니 간단한 개념이었다. class 계층은 인스턴스, 즉 object를 생성하기 위한 template이고, 이러한 class 간의 상속 관계를 class 계층이라고 하는 것이다. 


object 계층은 class 계층과는 다른 레벨의 추상화 단계에 있는 개념이다(another level of abstraction (e.g. in run-time). 코드 상에서 new로 할당된 객체(instance)들을 추상화하고, 이들간의 composition 관계를 나타낸 것이 object 계층이다.


enter image description here


위 사진을 보면, Wheel에는 고무나 프레임 같은 속성들이 있을텐데 여기서는 그 부분을 생략하여 추상화하였다. 


정리하자면, class 계층은 OOP에서의 클래스들 간의 관계이고, objects 계층은 실제 프로그램에서 메모리에 할당된 object 간의 관계를 나타낸 것이다.



알고나면 간단한 개념이다. 그런데 사수 분께서 이게 중요한 내용이라고 하니 우선은 염두하면서 개발해야겠다.




참고


oop - Class vs Object hierarchies


class - Object Hierarchy in OOP



'QT' 카테고리의 다른 글

LNK2019 외부 기호 참조 위치 함수 에서 확인 하지 못했습니다  (0) 2019.01.28
QTableView edit이 되지 않을 때  (3) 2018.05.23
Qt LNK 2019 에러  (1) 2018.04.30
Q_OBJECT 란  (1) 2018.02.28
블로그 이미지

NCookie

,

Q_OBJECT 란

QT 2018. 2. 28. 11:12

Q_OBJECT


The Q_OBJECT macro must appear in the private section of a class definition that declares its own signals and slots or that uses other services provided by Qt's meta-object system.

http://doc.qt.io/qt-5/qobject.html#Q_OBJECT


Notice that the Q_OBJECT macro is mandatory for any object that implements signals, slots or properties. You also need to run the Meta Object Compiler on the source file. We strongly recommend the use of this macro in all subclasses of QObject regardless of whether or not they actually use signals, slots and properties, since failure to do so may lead certain functions to exhibit strange behavior.

http://doc.qt.io/qt-5/qobject.html - Detailed Description


Q_OBJECT는 siganl이나 slot 등 Qt의 meta-object system을 사용하려는 클래스에서 private 영역에 선언해야 하는 매크로이다. 라고 한다. 그리고 만약 위의 기능을 사용하지 않는다고 해도 이 매크로를 사용하는 것을 권장하고 있다.




The Meta-Object System


그렇다면 여기서 meta-object system이란 무엇일까


Qt에서의 meta-object system은 object 간의 통신 메카니즘을 위한 signal과 slot, 런타임 타입 정보, 그리고 동적 property 시스템을 제공한다.


그리고 아래 세 가지에 베이스를 두고 있다.

1. QObject 클래스 meta-object system을 이용할 수 있는 오브젝트에 대한 base 클래스를 제공한다.

2. 클래스의 private 섹션에 선언된 Q_OBJECT 매크로는 dynamic properties, signal, slot 등과 같은 meta-object의 기능을 사용할 수 있게 한다.

3. Meta-Object Compiler(moc)는 QObject의 subclass에게 meta-object 기능 구현에 필요한 코드를 지원한다.


moc 툴은 C++ 소스 파일을 읽어 Q_OBJECT 매크로가 선언된 클래스를 찾고, meta-object 코드가 포함된 소스를 생성한다. 이 생성된 코드는 클래스의 소스 파일에서 include 하는데, 일반적으로 클래스 구현과 함께 컴파일 및 링크가 된다.



원문을 보고 해석했는데, 이게 맞는지 잘 모르겠다.


나중에 정확히 이해하면 다시 정리해봐야겠다...




참고


http://doc.qt.io/qt-5/metaobjects.html

블로그 이미지

NCookie

,