7월, 2015의 게시물 표시

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]) 를

< 인사이드 아웃 > 을 보고...

며칠 전에 아내가 보고 싶은 애니가 있다고 해서 의아했었다. 평소에 애니를 즐기는 편이 아니었기에 더욱 그랬다. 무슨 애니냐고 물었더니, <인사이드 아웃> 이라고 했다. 보니까 방송에서도 몇 몇 프로에서 <인사이드 아웃> 을 다루기도 했었다. 큰 기대감 없이 보았다. 그런데 어느 순간 눈물을 흘리고 있었다. "빙봉" 이 떠나갈 때... 빙봉은 "라일리" 의 상상의 친구이다. 그 친구가 "기억의 쓰레기장" 으로 사라져 버렸다. 스스로 사라져 버렸다. 라일리의 사춘기가 시작되는 나이에. 우리가 유년기를 지나갈 때, 상상은 더 이상 함께 할 수 없는 것일까 ? 가끔 EBS 에서 하는 <두근두근 학교에 가면> 이라는 프로그램을 본다. 1학년 2반 담임 선생님과 아이들의 모습을 관찰하는 것이다. 이 때 아이들의 모습은 그야말로 천진난만하고 상상력이 폭발한다. 매사에 적극적이고 활동적이다. 이 프로그램 말고도 초등학교 저학년 아이들의 모습을 관찰하는 프로그램들에서는 항상 볼 수 있는 모습이다. 하지만, 초등학교를 지나 중학교 그리고 고등학교로 진학할수록, 아이들의 이런 모습이 사라지고 있음을 알 수 있다. 애니에서는 사춘기로 접어들면서 라일리의 내면에서 스스로 사라져 가는 것으로 그려졌지만, 어쩌면 사회가 라일리과 빙봉의 이별을 강요하고 있는 것인지도 모른다. 사실 주변을 살펴보아도, 어릴 때의 상상을 그대로 가지고 있는 사람들은 "어린 아이 같다" 는 평을 듣는다. 물론 이 때 이 말은 좋은 뜻을 가지고 있지는 않다. 상상에서 멀어지고, 현실에 가까워지는 것이 우리 내면의 작용일수도 있지만, 사회의 작용일수도 있겠다는 생각이 든다. 라일리의 내면에 있는 감정들 중에서 주요한 역할을 하는 것은 "기쁨이"와 "슬픔이" 인 듯하다. 그 중에서도 기쁨이가 전체를 이끌어 가는 것으로 그려진다. 그런데 분명 같은 기억의

Qt 로 만들자: 숫자 야구

이미지
어릴 때 한 번 쯤은 누구나 숫자 야구를 해 보았을 것이다. 이번에는 이 숫자야구를 구현해보자. 1. 요구 사항 숫자 야구의 규칙은 다음과 같다. 공격수는 0 부터 9 까지 숫자 중에 3 개의 숫자를 고른다 숫자와 위치가 모두 맞으면 스트라이크 숫자는 맞고 위치가 다르면 볼 스트라이크만 3개면 종료 수비수의 숫자 3 개는 겹치지 않는다 2. 구현 2.1 프로젝트 생성 프로젝트 이름 : Baseball 메인 클래스 이름 : Baseball 메인 클래스 유형 : QMainWindow 2.1 사용할 위젯 3 개의 숫자를 입력받기 위한 3 개의 QLineEdit 위젯 입력을 완료하기 위한 버튼 숫자 야구를 새로 하기 위한 버튼 그동안 입력한 숫자와 그에 대한 판정을 기록할 리스트 2.2 헤더 파일(baseball.h) 다음은 이를 구현한 헤더 파일의 내용이다. Colored By Color Scripter ™ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 #ifndef  BASEBALL_H #define  BASEBALL_H #include  <QMainWindow> #include  <QtWidgets> class  Baseball :  public  QMainWindow {     Q_OBJECT public :     Baseball(QWidget *parent = 0);     ~Baseball(); private :      static   const   int  MAX_ANSWER_COUNT = 3;     QList<QLineEdit *> _numLineList;     QPushButton *_enterPush;

Qt 로 만들자: BMI 계산기

이미지
BMI(Body Mass Index, 체질량 지수) 는 자신의 비만도를 확인해 볼 수 있는 있는 지수로, 비교적 간단한 계산을 통해 그 값을 알 수 있다. 이번에는 BMI 를 계산해서 비만도를 알려주는 BMI 계산기를 만들어보자. 1. 요구 사항 BMI 를 계산하기 위해서는 키(m) 와 몸무게(kg) 가 필요하기 때문에, 키와 몸무게를 입력받기 위한 부분이 필요하다. 그런데 일반적으로 키는 cm 단위가 더 익숙하므로, m 단위 대신에 cm 단위로 입력받는다. 사용자가 키와 몸무게를 입력한 후에, BMI 계산을 수행하게 하는 장치가 필요하다. 그리고 그 계산 결과를 보여줄 필요가 있다. 이를 기반으로 실제 코드를 작성해 보자. 2. 구현 앞서 <Hello, world!!!> 를 작성할 때처럼 <BMI 계산기> 를 위한 새로운 프로젝트를 작성하고, 이 때 프로젝트 이름과 메인 윈도의 클래스 이름은 모두 BMI 로 한다. 프로젝트가 만들어지고, bmi.cpp 가 열리면 bmi.h 로 이동한다. 왼쪽에 있는 [Projects] 창에서 선택해도 되고, [F4] 를 눌러도 된다. [F4] 는 .cpp 와 .h 를 전환하는 단축키이다. 우선   #include <QMainWindow>   다음에 #include <QtWidgets>   를 추가하자. Qt 는 모든 클래스에 해당하는 헤더 파일을 제공하고, 해당 클래스를 쓰기 위해서는 반드시 해당 헤더 파일을 포함해야 한다. 예를 들어, QLabel 클래스를 사용하고자 한다면 #include <QLabel> 를 추가해야 한다. 하지만, 매번 개별 클래스를 사용하기 위해 개별 헤더 파일을 포함하는 것은 매우 귀찮은 일이다. 그래서 Qt 는 이를 해소하기 위한 헤더 파일을 제공하는데 QtWidgets 도 그 중의 하나이다. 이 파일은 위젯 관련 헤더파일들을 모두 포함한다. 따라서 이 파일 하나만 포함하면 필도의 개별