Tag Archives: QT

Qt 4.2.0/VS2005 SP1 문제 해결

윈도 비스타에서는 어쩔 수 없이 VS2005 SP1을 사용해야 한다. 그런데 윈도 비스타에서 VS2005 SP1을 사용하여 아마 QMap/QHash가 들어간 프로그램을 컴파일하는데 오류가 생겼다. 다행히토 트롤텍은 둘러가기 패치를 제공하고 있었지만, 이마저도 듣지 않았다. 그래서 이 문제 가지고 MSDN과 각종 Qt 포럼이 아직도 들썩대고 있다.
그런데 그 둘러가기 패치의 코드와 내가 가지고 있는 Qt의 문제성 헤더의 줄 번호가 약간씩 차이가 났다. 그리고 둘러가기 패치는 그 주변 코드를 알 수가 없어서 뭐가 문젠지 알아내는 데 시간이 좀 걸렸다. 실제로 내가 적용시킨 것은 다음과 같다.

<QHash.h>
일단 390줄 부근에서 찾기 바란다.
private:
       // ### Qt 5: remove
       inline operator bool() const { return false; }
   };
   friend class const_iterator;
typedef typename QHash<Key, T>::iterator DummyHashIterator;
   // STL style
   inline iterator begin() { detach(); return iterator(d->firstNode()); }
   inline const_iterator begin() const { return const_iterator(d->firstNode()); }

그리고 한 890줄 부근에 있다.
public:
   QMultiHash() {}
   QMultiHash(const QHash<Key, T> &other) : QHash<Key, T>(other) {}

   inline typename QHash<Key, T>::iterator replace(const Key &key, const T &value);
   inline typename QHash<Key, T>::iterator insert(const Key &key, const T &value);
    
       inline typename DummyHashIterator replace(const Key &key, const T &value);
       inline typename DummyHashIterator insert(const Key &key, const T &value);

   inline QMultiHash &operator+=(const QMultiHash &other)
   { unite(other); return *this; }

파란색 부분을 찾은 다음 지우고 빨간색으로 바꾸면 된다.

<QMap.h>
310줄 부근에서 찾기 바란다.
private:
       // ### Qt 5: remove
       inline operator bool() const { return false; }
   };
   friend class const_iterator;

       typedef typename QMap<Key, T>::iterator DummyMapIterator;
   // STL style
   inline iterator begin() { detach(); return iterator(e->forward[0]); }
   inline const_iterator begin() const { return const_iterator(e->forward[0]); }

그리고 한 890줄 부근에 있다.
public:
   QMultiMap() {}
   QMultiMap(const QMap<Key, T> &other) : QMap<Key, T>(other) {}

          inline typename QMap<Key, T>::iterator replace(const Key &key, const T &value);
    inline typename QMap<Key, T>::iterator insert(const Key &key, const T &value);

           inline typename DummyMapIterator replace(const Key &key, const T &value);
           inline typename DummyMapIterator insert(const Key &key, const T &value);

   inline QMultiMap &operator+=(const QMultiMap &other)
   { unite(other); return *this; }

파란색 부분을 지우고 빨간색 부분으로 바꾸기 바란다. 그 결과 해결되는 척 하였다.

아아아아아아아아아아아아안돼애애애애애애애애애애애!

사용자 삽입 이미지트롤텍에서 하는 Qt 세미나란 것이 있어서 너무 끌려서 서울행 KTX 예약할 생각하고 #tokigun에서 이거 가지고 이야기하고 있었다. 기분좋게 International Registration 눌러 보니까, Registration is free, but seating is
limited, so reserve your spot today!
이 말에 조낸 흥분해서 예약하려고 했다. 그런데 그런데, 국내의 한 사이트에 가 보니, 아예 죽여라 죽여. 트롤텍 홈페이지가 구라를 치는 건지 너희가 구라를 치는 건지. 나는 접수 한다고 해도 트롤텍 홈페이지에다가 할 꺼니까, 그냥 차라리 안가고 만다.
혹시 이거 가실 수 있는 분이 있다면, 누군가가 저 경험담 좀 전해 주시기 바랍니다. 저도 꼭 가고 싶다고요!

Qt 4.2: 스타일시트

말도 많고 탈도 많았던 Qt 4.2가 드디어 나왔다. 가장 큰 차이점은 http://doc.trolltech.com/4.2/qt4-2-intro.html 페이지에 그대로 나와 있다. Qt 4.2 덕분에 QOM에서 해결하지 못했던 난제 중 하나인 사용자 정의 온라인 사전 찾기 기능(기본적으로 뇌입어, 위키낱말사전 제공 예정), 시스템 트레이 상주(쓸 사람 있으려나) 등의 구현이 쉬워졌지만, 트롤텍이 말씀하시길 이 모든 기능을 저 골로 보낼 수 있는

“위젯 스타일시트”

가 등장하였다. CSS를 모르는 사람은 없을 것이다. 그런데 그런 CSS가 웹에만 쓰이는 것이 아니라 데스크탑 테마를 꾸미는 데 사용된다고?! 그것도 우리가 늘상 보아 오는 그런 것들에?! 나도 처음에는 이 개념이 잘 이해가 가지 않았지만, 위젯 스타일 시트 문서를 보니까 조금씩 이해가 가기 시작했다. 우선 간단한 예제를 보자.
이 예제는 Qt 4.2에 포함되어 있는 스타일시트 예제이다. 일단 이것을 기본값으로 실행시키면 평범한 윈도 프로그램인 척 하고 있다.

Coffee 스타일시트를 적용시키면 이렇게 변신한다.

Pagefold 스타일시트는 이렇게 변하는데, 우리가 주목해야 할 것은 엄마친구아들이 아닌, QWidget에 걸려 있는 백그라운드이다. 즉, 다른 클래스에도 스타일시트를 적용하면 간지나는 버튼을 만들기 위해서 고민해야 할 필요가 없다는 것이다.

KDE4가 아마도 Qt 4.2 기반으로 탄생할 것이라고 하는데, 이렇게 되면 테마 만들기가 더욱 수월해 질 것이라고 하며, 위젯들의 OpenGL 기반 렌더링까지 지원하기 때문에 별의별 일이 가능해질 것이라고 한다. 일단 QOM에도 스타일시트 기반 스킨 기능을 추가시키는 것이 좋을 것 같은데… 아직 QOM 2가 끝나지 않은 상태에서 섣부른 기댄가.

Qt에서 프로그램 설정 저장하기

언제 나올지 모르는 QOM 2.0을 작업하고 있는 이 시점에서 최근 이뤄진 기능은 환경 설정과 저장이다. 대부분의 프로그램이 따르듯이 시작 시 로드/종료 시 저장 모델을 따르기 위해서 시작 시 레지스트리나 C:\Documents and Settings\%USERNAME%\Application Data\QOM 같은 폴더에 파일을 쓴 다음 불러오는 모델을 취하려고 했다. 그래서 QOM의 입력/테스트 플러그인 모두가 개별 설정을 가질 수 있도록 하였고, API에 LoadConf와 InitTest2 함수가 추가되었다. 이들은 각각 설정과 관련되어 있는 함수이다.
그런데 내가 plain text 파일로만 할 것인가? 그래서 레지스트리에 저장도 고민해 보았지만 이것은 크로스 플랫폼적인 방법이 아니다. QOM의 장점 중 하나인 리눅스 및 맥 OS X 소스 호환성을 내가 앞장서서 깰 이유는 없기 때문이다. 그래서 찾다찾다 고민하다 나온 것이 QSettings 클래스이다. 이 녀석은 다양한 곳에 단순하게 쓸 수 있는 것이 을 연상시킨다.
쓰는 방법이 실제로 간단하다. 우선 ui가 시작되는 곳에
QSettings settings("회사명", "프로그램명");
을 집어넣는다. 그리고 설정을 읽어오려면
global.showwords = ksets.value("module/showwords", false).toBool();
global.random = ksets.value("module/random", false).toBool();
global.inverse = ksets.value("module/inverse", false).toBool();
global.whole = ksets.value("module/whole", true).toBool();
global.list_inverse = ksets.value("module/list_inverse", false).toBool();
global.words_count = ksets.value("module/words_count", -1).toInt();

같이 value 함수를 이용해서 원하는 경로에 있는 값을 읽어올 수 있다. 그리고 설정을 쓰는 것은 프로그램이 종료될 때 똑같은 선언을 해 준 다음
ksets.setValue("module/showwords", global.showwords);
ksets.setValue("module/random", global.random);
ksets.setValue("module/inverse", global.inverse);
ksets.setValue("module/whole", global.whole);
ksets.setValue("module/list_inverse", global.list_inverse);
ksets.setValue("module/words_count", global.words_count);
ksets.setValue("module/encoding_name", global.encoding_name);

와 같이 setValue를 사용해 주면 된다. 기본적으로 모든 플랫폼에서 가장 적합한 방법을 고르기 때문에 문제가 생길 가능성은 없다. 윈도의 경우 레지스트리 키가 이렇게 생긴다.
리눅스의 경우 conf 파일이 비슷하게 생긴다고 알고 있으며, 결론은 귀찮게 레지 값이나 텍스트 파일 찌르는 것보다 이런 게 더 낫다는 것이다.