이 매뉴얼은 JK전자(JK Electronics) 에 의해서 번역, 수정, 작성 되었고 소유권 또한
JK전자(JK Electronics)
의 것입니다. 소유권자의 허가를 받지 않고 무단으로 수정, 삭제하거나 배포 할 수 없습니다.
 

S3C6410 Start Kit QT2.2.0 Application Developer Guide


 

* Update history

- 2011.4.23 : 초기 Release


  이 메뉴얼은 Qtopia-2.2.0, Qt-Extendded-4.4.3 (Qtopia Phone Edition), QtE-4.7.0를 S3C6410 Start Kit 어플리케이션 개발에 대한 내용을 설명하는 메뉴얼 입니다.

1. Qtopia 2.2.0 Application Programming
1.1 My Calculator

이번 절에서는 Qtopia2.2.0 의 ARM 버젼의 예제 프로그램을 개발하는 절차와 실제로 몇가지 예제를 작성해 보도록 합니다. 아래는 이제부터 작성할 예제인 계산기가 실핼된 화면 입니다.

qtopia

개발용 PC에 Qt 예제 프로그램을 작성할 작업 디렉토리인 "qtopia2_apps" directory 를 생성 합니다.

# mkdir -p /opt/qtopia2_apps
# cd /opt/qtopia2_apps
# mkdir mycalc

(1) Qt 디자이너 실행

GUI 환경의 개발툴을 이용해서 Qt 프로그램을 작성해 보도록 합니다. Qt 디자이너를 이용해서 "main_form_base.ui" 파일을 생성 합니다.

# cd mycalc
# /opt/mini6410/qtopia-free-2.2.0/qt2/bin/designer main_form_base.ui

위의 명령을 실행하면 "New Form" 다이얼로그가 나오고 여기에서 "Widget" 을 선택합니다.

qtopia

(2) 프로그램 GUI 디자인

Qt 디자이너는 자동으로 ".ui" GUI 리소스 파일과 ".ui" 파일과 관련된 C++ 파일을 생성 합니다. 위젯을 생성한 후에 생성된 윈도(위젯)의 속성과 값들을 수정 합니다. 윈도의 크기는 개발보드의 LCD사이즈에 맞도록 적당한 크기로 변경 합니다.

qtopia

위에서 윈도 속성값들을 변경한 후에 윈도에 컨트롤들을 배치하고 속성값들을 수정 합니다.윈도 환경에서 Visual C++, Basic 등의 프로그램을 개발해본 개발자라면 굉장히 비슷하다고 여겨질 것입니다.
아래 그림처럼 컨트롤들의 속성을 수정 합니다.

qtopiaqtopia

qtopia

여기까지 컨트롤들에 대한 속성(Property) 설정까지는 완료 되었고 이제 컨트롤들에 이벤트 핸들러를 연결해 보도록 합시다.

(3) 이벤트 함수 추가

"=" 텍스트의 버튼 컨트롤에 Click Event를 연결해 보도록 합시다. Click Event는 사용자가 "=" 버튼을 마우스, 혹은 키보드로 놀렀을때 발생하는 이벤트 입니다. 이때 실제로 사용자가 버튼을 클릭 했을때 어떤 처리를 수행시키고 싶으면 버튼의 클릭 이벤트와 함수를 연결 시키면 됩니다. 이렇게 하기 위해서 버튼의 "Slot Editor" 를 실행 합니다. 흡사 윈도에서 비주얼C++ 개발할때 이벤트 핸들러를 작성하는것과 비슷 합니다. 단지 Qt에서는 이런 것들을 이벤트가 아닌 Slot와 Signal이라는 메커니즘을 통해서 구현 합니다. "MainForm" 위에서 오른쪽 마우스를 클릭하고 "Slot" 메뉴를 선택 합니다

qtopia

"New Slot" 버튼을 클릭한 후 Slot 이름을 "calcButtonClicked()" 와 "closeButtonClicked()" 를 추가 합니다.

 

qtopia

나중에 Click 이벤트에 대응하는 적절한 함수를 연결 해야 합니다.

"Close" 버튼에 이벤트 함수 연결하기 위해서 "Signal/Slot" qtopia아이콘을 선택하고 "Close" 버튼을 선택한 상태에서 드래그 하여 "TMainForm" 위에서 마우스 버튼을 Release합니다. 그려면 위에서 작성한 "Slot" 리스트 들이 아래와 같이 나타 납니다.

qtopia

"btnClose" 버튼과 "btnCalc" 버튼에 적절한 "Slot" 함수를 선택해서 연결 합니다.

(4) 이벤트 함수 구현

여기까지 인터페이스 디자인이 완료되었으면 이제 소스코드를 작성해 보도록 합니다.
main_form.h, main_form.cpp, main.cpp 3개의 파일이 필요 합니다.
간단하게 vi 에디터를 이용해서 main.cpp 를 수정해 보도록 합니다.

# vi main.cpp

vi 에디터에서 다음의 내용을 입력 합니다.

#include "main_form.h"
#include <qtopia/qpeapplication.h>

QTOPIA_ADD_APPLICATION("mycalc",TMainForm)
QTOPIA_MAIN


main.cpp 는 단순희 4줄의 매크로 확장 코드로 이루어진 간단한 main 함수 입니다. TMainForm 는 main window object 로 QApplication::exec () 를 실행 시키고 main event loop 로 진입 합니다. main_form.h 파일은 없으므로 새로 생성 해야 합니다.

main.cpp와 마찬가지로 vi 에디터를 이용해서 생성 합니다.

# vi main_form.h

#if !defined (__MAIN_FORM_H__)
#define __MAIN_FORM_H__
#include "main_form_base.h"
#include <qsocketnotifier.h>

class TMainForm: public TMainFormBase {
Q_OBJECT public: TMainForm(QWidget * parent = 0, const char * name = 0, WFlags f = WType_TopLevel) : TMainFormBase(parent,name,f) {}
virtual ~TMainForm() {}

public slots:
void calcButtonClicked();
void closeButtonClicked();

};

#endif


추가로 main_form.h을 포함하는 main_form_base.h 파일이 있는데 이 파일은 개발자가 생성하는 파일이 아니고 UI 디자이너 툴에서 자동으로 생성 시키는 파일 입니다. 이제 실제로 이벤트가 발생 했을 경우 처리하는 이벤트 핸들러 함수를 작성 합니다.

# vi main_form.cpp

#include "main_form.h"
#include <qlineedit.h>

void TMainForm::calcButtonClicked() {
m_result->setText( "" );
if (m_x->text().isEmpty() || m_y->text().isEmpty())
{
return;
}

bool ok = false;
int x = m_x->text().toInt(&ok);

if (!ok)
{
m_x->setText("");
return ;
}

ok = false;
int y = m_y->text().toInt(&ok);

if (!ok)
{
m_y->setText("");
return ;
}

m_result->setText( QString::number( x + y ) );

}

void TMainForm::closeButtonClicked()
{
close();
}


소스코드에 대해서 자세한 설명은 하지 않아도 어떤 내용인지 알 수 있을것 같습니다.

모든 소스코드들의 수정이 완료 되었으면 컴파일 하기전에 마지막으로 프로젝트 파일을 작성해야 합니다.

# vi mycalc.pro

CONFIG += qtopiaapp

CONFIG -= buildQuicklaunch
HEADERS = main_form.h
SOURCES = main_form.cpp main.cpp
INTERFACES = main_form_base.ui
TARGET = mycalc



CONFIG+=qtopiaapp : Qtopia 프로그램의 종류 입니다.
HEADERS and SOURCES : mycalc 프로젝트의 소스코드와 헤더 파일을 나열 합니다.
TARGET : 컴파일 후 생성되는 최종 실행 파일의 이름을 입력 합니다.

(5) x86용 컴파일 및 실행

PC버젼의 컴파일 스크립트인 "buildhost.sh" 를 실행 시킵니다. 참고로 "buildhost.sh" 파일은 PC버젼의 qt application의 컴파일을 편하게 하기 위해서 미리 만들어둔 스크립트 파일 입니다. 스크립트의 내용은 아래와 같습니다.

#!/bin/sh

source /opt/qtopia-free-2.2.0/setQpeEnv
qmake -o Makefile.host -spec qws/linux-generic-g++ *.pro
make -f Makefile.host clean
make -f Makefile.host



스크립트 파일에 실행 권한을 부여 합니다.

# chmod +x buildhost.sh

빌드 스크립트를 실행 합니다. 스크립트가 성공적으로 실행되기 위해서는 "/opt/ qtopia-free-2.2.0/" 에 qtopia 2.2.0 이 설치 되어 있어야 합니다. 만약 qtopia가 다른 경로에 설치되어 있다면 위의 스크립트 파일 내용중에서 "source /opt/qtopia-free-2.2.0/setQpeEnv" 부분을 적절하게 수정해 주면 됩니다.

# ./buildhost.sh

컴파일이 성공적으로 완료되면 mycalc 디렉토리에 mycalc 실행 파일이 생성 됩니다. 생성된 실행파일을 PC에서 실행시켜 봅니다. 아래 명령은 mycalc를 실행 시키기 전에 먼저 qtopia를 실행시키는 명령 입니다.

# cd /opt/qtopia-free-2.2.0/
# ./run&

qtopia를 실행시키고 난후에 몇가지 환경 변수를 등록하고 mycalc 어플리케이션을 실행 합니다. 환경 변수들은 리눅스 사용자 프로파일에 등록 시켜놓으면 편리 합니다.

# cd /opt/mini6410/qtopia2_apps/mycalc
# export QTDIR=/opt/qtopia-free-2.2.0/qtopia/image/opt/Qtopia/
# export QPEDIR=/opt/qtopia-free-2.2.0/qtopia/image/opt/Qtopia/
# export HOME=$QPEDIR/root/
# export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBARAY_PATH
# ./mycalc

qtopia

(6) ARM용 컴파일 및 실행
x86용 컴파일할때와 마찬가지로 컴파일을 편리하게 하기 위해서 우리는 "buildarm.sh" 스크립트를 미리 만들어 두었습니다. 이 스크립트를 실행하여 ARM버젼으로 어플리케이션을 컴파일 합니다. 스크립트 파일의 내용은 아래와 같습니다.

# vi buildarm.sh

#!/bin/sh source

/opt/mini6410/qtopia-free-2.2.0/setQpeEnv
qmake -spec qws/linux-arm-g++ -o Makefile.target *.pro
make -f Makefile.target clean
make -f Makefile.target



스크립트 파일에 실행권한을 부여하고 스크립트를 실행하여 컴파일을 합니다.

# chmod +x buildarm.sh

빌드 스크립트를 실행 합니다. 스크립트가 성공적으로 실행되기 위해서는 "/opt/ qtopia-free-2.2.0/" 에 qtopia 2.2.0 이 설치 되어 있어야 합니다. 만약 qtopia가 다른 경로에 설치되어 있다면 위의 스크립트 파일 내용중에서 "source /opt/qtopia-free-2.2.0/setQpeEnv" 부분을 적절하게 수정해 주면 됩니다.

# ./buildarm.sh

개발용 PC에서 컴파일한 결과물을 SD메모리에 복사한다음 개발보드에 SD메모리를 삽입하고 실행파일을 Qtopia/bin 디렉토리에 복사한다음 실행 권한을 부여 합니다.

# cp /sdcard/mycalc /opt/Qtopia/bin/
# chmod +x /opt/Qtopia/bin/mycalc

아직은 Qtopia환경에 실행 아이콘이 등록되지 않는 상태이므로 명령행에서 실행해 보도록 하겠습니다.

# cp /bin/run_my_qtopia /bin/run_mycalc
# vi /bin/run_mycalc

run_mycalc 파일의 마지막 줄의
exec $QPEDIR/bin/qpe 를 exec $QPEDIR/bin/mycalc 로 수정하고 아래 명령을 수행 합니다.

# chmod +x /bin/run_mycalc
# run_mycalc&

(7) mycalc 프로그램을 Qtopia 환경에 아이콘으로 등록해서 실행
앞절에서는 명령행에서 프로그램을 실행시키는 방법에 대해서 알아 보았고 이번에는 Qtopia실행 환경에서 아이콘으로 등록해서 실행하는 방법에 대해서 알아보도록 합니다. Fedora9의 "/usr/share/icons/hicolor/48x48/apps" 디렉토리에 몇가지 재미있는 아이콘들이 있습니다. 그 중에서 우리는 "gnome-sudoku.png" 파일을 mycalc 프로그램의 실행 아이콘으로 사용해 보도록 합시다. 개발용 PC에서 아래 명령을 입력 합니다.

# cd /usr/share/icons/hicolor/48x48/apps/
# cp gnome-sudoku.png /opt/mini6410/qtopia2_apps/mycalc/mycalc.png

먼저 mycalc에 대한 desktop 파일을 작성 합니다.

# cd /opt/mini6410/qtopia2_apps/mycalc/
# vi mycalc.desktop

[Translation]
File=QtopiaSettings
Context=mycalc
Comment[Desktop Entry/Name]=Use soft hyphen (char U00AD) to indicate hyphenation

[Desktop Entry]
Exec=mycalc
Icon=mycalc
Type=Application
Name[]=My Calculator
CanFastload=0



개발용 PC에서 작성된 mycalc.png, mycalc.desktop 파일을 SD메모리에 복사한후 SD메모리를 개발보드에 삽입한후 다음 명령을 실행 합니다.

# cp /sdcard/mycalc.desktop /opt/Qtopia/apps/Applications/
# cp /sdcard/mycalc.png /opt/Qtopia/pics/

파일 복사가 완료되면 개발보드를 재부팅 합니다.

qtopia

2. Qtopia2.2.0 에서 프로그램 그룹 등록 방법

이번 절에서는 Qtopia 2.2.0에 "MyApps" 라는 프로그램 그룹을 생성시키고 우리가 작성한 어플리케이션들을 새로 생성한 그룹에 포함시키도록 해 봅시다.
먼저 "/opt/mini6410/qtopia2_apps/" 디렉토리를 생성하고 생성된 디렉토리안에 ".directory" 파일을 작성 합니다.

# mkdir -p /opt/mini6410/qtopia2_apps/MyApps/

# cd /opt/mini6410/qtopia2_apps/MyApps/
# vi .directory


[Translation]
File=QtopiaApps
Context=MyApps

[Desktop Entry]
Name[]=MyApps
Icon=MyApps