그래픽 & 멀티미디어
QT는 GUI 프로그램을 만들기 때문에 코드 중심으로 프로그램을 작성하기 보다는 디자이너를 적극 이용하면서, 또한 가급적 디자이너 안에서 모든 코드를 작성하는 방법을 사용하고 싶습니다. QT에 대한 정보를 찾아 보면 대부분 문자 코딩으로된 예제가 대부분이더군요.
이것은 당연할지 모릅니다. 디자이너를 이용하는 방법은 그림으로 일일이 캡쳐하거나 디자인 작업을 글로 설명해야 하는데 쉽지 않죠. 여하튼 이런 사정으로 디자이너로 프로그램을 작성하는 방법에 대해서는 구하기 쉽지 않네요.
그러나 조금씩 학습해 가면서 가급적 디자이너를 이용하여 프로그램을 작성하는 방법을 위주로 글을 올리겠습니다. 혹, 틀린 내용이 있다면 지적해 주시고, 도움이 되는 글이나 말씀을 올려 주시면 감사겠습니다.
폼의 마우스 클릭 이벤트 처리
- 프로제트 파일 생성, "C++ Project"를 선택합니다.
- 적당한 프로젝트 이름을 입력합니다.
- 프로젝트 파일을 저장합니다.
- 폼 이름을 지정합니다. 이 이름이 클래스 이름이 되므로 적당한 이름을 지정해 줍니다. 여기서는 frmMain으로 입력하겠습니다.
- 마우스의 위치를 출력하기 위해 TextLabel 2개를 배치합니다.
- 이제 폼에 마우스 버튼이 클릭할 때마다 TextLabel의 문자값을 출력해야 하는데, 이렇게 하기 위해서는 마우스가 클릭될 때를 알아야 합니다.
QT는 비주얼 베이직이나 델파이에서처럼 이벤트를 처리해 주는 함수를 제공합니다. Microsoft Windows 프로그램만 작성하다 보니, 단어 선택이 옳바른지 모르겠습니다만, 이런 이벤트성 함수를 지정하고 사용할 수 있습니다.
만일 폼에 마우스 버튼이 클릭되면 mousePressEvent() 라는 함수가 호출되어 집니다. 이 함수를 폼의 Functoins에 입력합니다.
Object Explorer >> Members 탭 >> Functions 에서 적당한 접근자를 마우스 오른쪽 버튼으로 클릭한 후 New 메뉴를 클릭합니다.
함수 이름 부분에 mousePressEvent( QMouseEvent *eve) 라고 입력합니다.
- 그러면 아래와 같이 함수가 등록됩니다.
- 이제 생성된 함수를 클릭하면 코드를 입력할 수 있습니다.
- 아래와 같이 코드를 입력합니다.
void frmMain::mousePressEvent( QMouseEvent *eve ) { QPoint position = eve->pos(); labX->setNum( position.x() ); labY->setNum( position.y() ); }
- 폼을 프로젝트 파일이 있는 곳에 저장합니다.
- File 메뉴 >> New를 선택하고 C++ Main File을 선택합니다.
- 메인 폼을 선택 윈도우에서 frmMain을 선택합니다.
- 이제 모든 파일을 저장한 후 빌드하면됩니다.
]$ qmake ]$ make
- 프로그램을 실행하고 마우스를 클릭하면 아래와 같은 화면이 됩니다.
TrollTech의 Online Reference Documentation
그렇다면 mousePressEvent( QMouseEvent *eve ) 함수 이름을 어떻게 알 수 있을까요? TrollTech의 Online Reference Documentation 페이지에서 아실 수 있습니다. 방문해 보시면 QT 버전별로 문서가 정리되어 있는 것을 보실 수 있습니다.
저는 QT 3.3을 사용하고 있으므로 QT 3.3 링크를 애용합니다. All Classes나 Main Classes를 클릭합니다.
예제에서 메인 폼을 Dialog에서 받았고, 또한 make 후에 frmMain.h의 내용을 보셔도 아시겠습니다만, frmMain은 QDialog를 상속받은 객체입니다.
class frmMain : public QDialog
그러나 QDialog에는 마우스 클릭과 관련한 멤버 함수가 없습니다. QDialog 는 QWidget 에서 상속받았으므로 QWidget의 내용을 확인해 봅니다. Protected Members를 보면 virtual void mousePressEvent ( QMouseEvent?*?e ) 가 보입니다. 그 함수이름과 인수 탑입을 그대로 복사하여 사용하시면 됩니다.
태그: *QT *그래픽