· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
QT Programming Introduction



Qt는 여러 플랫폼에 걸쳐 소스 코드 호환성을 제공하는 ( Qt라이브러리만을 사용하여 프로그램을 작성하였을 경우) 프레임워크입니다. 윈도우 및 리눅스 데스크탑 환경에서 거의 동일한 UI Look&Feel 및 기능을 제공합니다. Qt를 사용하기 위해서는 Qt 라이브러리 및 개발툴(qmake) 외에 UI생성을 위한 Qt Designer 와 레퍼런스를 위한 Qt Assistance가 필요합니다.


Qt Designer 에서 UI와 UI의 기능을 정의할 수 있으며 C/C++을 사용하여 동작을 정의합니다. 모든 ui 윈도우 및 컨트롤 - 버튼, 체크박스 등등 - 는 객체이며 객체의 속성을 변경하고 그 객체의 member function 을 호출하여 변화를 줄 수 있습니다. 각각은 c++클래스로 정의되어 있고, 클래스를 상속받아 기능들을 재정의 함으로서 새로운 윈도우 및 컨트롤을 생성할 수 있습니다.


우리가 MS Windows에서 보는 버튼,텍스트박스등의 컨트롤들을 qt에서는 widget이라고 부릅니다. 모든 widget들은 부모/자식 관계를 이루고 다른 widget을 포함하거나 다른 widget에 포함됩니다. 그러한 widget들을 Qt Designer를 이용하여 정적으로 생성하거나, 코드상에서 QWidget이나 QWidget에서 상속받아 생성된 클래스들을 동적으로 생성할 수 있습니다.


widget은 모든 컨트롤들의 기초가 됩니다. widget은 윈도우 시스템으로부터 마우스,키보드 그리고 여러 이벤트 통지를 받고 스스로의 모습을 화면에 그립니다. 모든 widget은 사각형의 모양이며, Z-Order에 의해 정렬됩니다.(화면 앞뒤 순서) 다른 widget에 의해 소유되지 않은 widget을 top-level widget이라고 부릅니다. 보통 top-level widget은 프레임과 타이틀바를 가진 윈도우가 됩니다. qt에서는 QMainWindowQDialog, QDialog를 상속받아 생성된 클래스들이 top-level window가 됩니다. top-level widget이 아닌 widget을 child widget이라고 부릅니다.보통 부모 widget으로부터 자식 widget을 시각적으로 구별하기 어렵습니다. QWidget은 생성할 때 부모 widget 에 대한 포인터를 넘겨주게 되어 있습니다. 생성자를 이용하여 widget간의 부모/자식 관계를 설정할 수 있습니다.


ui는 *.ui 파일과 ui의 동작을 정의하는 *.ui.h 파일로 구성됩니다. *.ui 파일은 디자인이 저장되고 *.ui.h에는 ui의 동작이 c++로 정의되어 저장됩니다.



2. 시작하기 :


Qt Designer를 실행하면 다음과 같은 창이 뜹니다.

s1.png
[PNG image (134.67 KB)]




Qt UI를 사용한 프로그램을 생성하기 위해서는 UI 디자인 파일(파일이름이 *.ui 임) 과 UI의 동작을 정의하는 코드 파일(파일 이름이 *.ui.h)과 프로그램의 전체 골격을 가지고 있는 프로젝트 파일(*.pro)와 Qt 어플리케이션을 생성하는 메인 엔트리 파일(main.cpp)가 기본적으로 존재해야 합니다.


먼저 ui 파일을 생성합니다.(File->New->Dialog 선택)
s2.png
[PNG image (120.36 KB)]



Qt Designer 메인 화면
tool_overview.png
[PNG image (137.72 KB)]



생성된 form 화면이 보입니다. 화면의 오른쪽에 properties를 보면 현재 focusing된 객체들의 속성들을 변경 할 수 있는데 생성된 form을 클릭하고 properties에 보면 form 의 이름이 form? 이런 식으로 되어 있는 것을 볼 수 있습니다. form의 이름을 적당하게 변경합니다. 디자인을 보면 form? 이렇게 창 텍스트에 이름이 적혀 있습니다. 해당 부분을 고치기 위해서는 Caption 속성을 변경합니다.


form을 생성하였다면 선택해서 프로젝트를 생성합니다. (File->New->Project) 프로젝트 파일은 *.pro로 이름지워지며 프로젝트마다 폴더를 따로 생성해서 관리하는 것이 편합니다. 오른쪽 창에 project overview 창이 있으며 해당 프로젝트에 포함된 ui,ui동작 코드, main.cpp파일에 대한 정보를 확인하고 항목을 추가/삭제할 수 있습니다.

이제는 해당 form을 메인 윈도우로 사용할 cpp프로그램 파일을 생성합니다. (File->New->C++ Main-File)

s3.png
[PNG image (97.37 KB)]


프로그램 파일을 생성할 때 메인 창으로 설정할 윈도우 이름을 고를 수 있습니다.


오른쪽 위 project overview 창에 ui파일과 main.cpp파일이 등록되어 있는 것을 확인하세요. 생성된 main.cpp파일의 내용은 다음과 같습니다.



#include < qapplication.h >
#include "form_main.h"  

int main( int argc, char ** argv )
{
    QApplication a( argc, argv ); 
    Form_Main w; 
    w.show(); 
    a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) ); 
    return a.exec(); 
}





QT를 이용하는 모든 애플리케이션은 QApplication 객체를 필요로 합니다. QApplication은 Qt를 이용한 프로그램의 전역적인 자원들을 관리합니다. qapplication.h 안에 정의되어 있습니다. Form_Main 윈도우를 생성하고 이것이 메인 윈도우가 됩니다. Show()함수를 호출해야 윈도우가 화면에 출력됩니다.


Qt에서 이벤트를 처리하는 방법은 Signal/Slot 으로 이루어진 Connection이라는 직관적인 방법으로 이루어져 있습니다. 어떠한 이벤트가 발생한 것에 대해, 그 이벤트가 발생한 widget(Sender)의 Signal에 의해 트리거링될 widget(Receiver)의 Slot함수를 정의하는 것입니다. Signal/Slot함수는 Widget 등의 클래스에 미리 정의되어 있기도 하고 임의로 추가할 수도 있습니다

<이벤트가 발생될 객체><발생되는 이벤트> <이벤트를 처리할 객체><호출될 함수>

앞에서부터 순서대로 Sender , Signal() , Receiver , Slot() 가 됩니다.



a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) ); 


이 코드는 QApplication 객체 a에서 lastWindowClosed이벤트가 발생되면 a.quit()함수를 호출하도록 이벤트를 연결하는 것을 의미합니다. 프로그램의 창이 모두 닫히게 되면 프로그램이 종료되도록 signal과 slot이 연결됩니다.


이렇게 해서 프로젝트에 메인 윈도우와 main.cpp파일이 생성되어 등록되었으면 프로그램을 빌드해서 실행해 볼 수 있습니다. 파일들이 존재하는 디렉토리로 이동하여, 프로젝트에 대한 Makefile을 생성해야 하는데 qmake 명령으로 할 수 있습니다. 생성된 Makefile을 이용하여 빌드하면 실행파일이 생성됩니다.

s6.png
[PNG image (127.37 KB)]





배우면서 작성하는 것이라 잘못된 내용이 있을 수 있습니다. 오류가 있으면, firsttimelove@hotmail.com 으로 알려주시면 빠르게 고치도록 하겠습니다. 좋은 하루 되세요


질문: 여기에 쓰여 있는 내용은 Qt 3 기준인데, 좀 있으면 Qt 3은 deprecated 된다고 알고 있고, 최신의 버전 Qt 4는 Qt 3과 바이너리/소스 호환이 되지 않습니다. 이 사실을 명시해야 할 것 같습니다. --peremen

---허걱...! 확인하고 수정하도록 하겠습니다. 감사합니다~ 원래 있던 글은 처음 위키를 써보느라 그림 사이즈를 조절 안하고 올려서 지웠고 질문은 이쪽으로 긁어서 붙였습니다.


ID
Password
Join
You will meet an important person who will help you advance professionally.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2007-10-30 01:08:20
Processing time 0.0024 sec