Qt/Embedded & Qtopia Qt/Embedded & Qtopia 2010. 12 안양대학교 전기전자공학과 서 삼 준
목 차 Embedded Linux GUI Toolkit Qt/Embedded Qtopia Virtual Frame Buffer 개발환경 및 과정 Qt/E Application Hello World program Signal & Slot Program Animation Clock Address Book Qtopia Program
Embedded Linux GUI Toolkit Microwindows 소형 임베디드 기기에 탑재할 목적으로 시작된 프로젝트로, 현대적인 그래픽 윈도우 환경 제공 OpenGUI 오픈 프로젝트로 진행되고 있으며, x86 어셈블리 커널에 GUI를 내장한 형태 갖춤 2D 형태의 화면을 제공하고 있으며, 이벤트 구동 방식의 윈도우 프로그래밍 환경 및 쉬운 어플리케이션 개발 환경을 가짐 Tiny-X X-window 시스템을 임베디드 시스템에 맞게 소형화시킨 버전 Qt/Embedded
Embedded Linux GUI Toolkit Microwindows OpenGUI
Qt/Embedded 노르웨이의 Trolltech사에서 개발한 리눅스 기반의 Qt 라이브러리로서 C++로 제작된 Embedded GUI Toolkit 편리한 포팅과 다양한 GUI 기능을 제공 최근 Qt/E 버전은 3.2.0 beta1까지 제공되고 있으며, 적용 버전은 2.3.2 버전 사용 X-윈도우 없이 리눅스 커널에서 제공하는 프레임 버퍼를 이용하여 그래픽 장치에 접근하는 방식
Qt/Embedded 특징 여러 플랫폼간 소스 코드 호환 풍부한 API 및 안정성 16bits Unicode 지원 PreRendering Font 사용: QPF Qt Designer등의 유용한 Tool 지원
Qtopia Qt/Embedded 기반으로 만들어진 Window Manager(WM)로서 콘솔 상에서 실행하는 Qt/E 어플리케이션을 MS-windows처럼 윈도우 상의 아이콘을 클릭하여 실행할 수 있는 환경 제공 WM 기능뿐만 아니라 Qt/E 기반으로 된 여러 가지 어플리케이션을포함하고 있으므로 Qtopia를 타겟보드에 포팅하여 PDA를 위한 WM 기능 구현 Qtopia에 제공되는 어플리케이션 Address Book, Calculator, Calendar, City Time, Clock, File Manager, Media Player, Spreadsheet, System Info, Terminal, Text Editor, Todo List
Qt/E Source: Trolltech OS : Redhat Linux 8.0 Source qt-x11-2.3.2.tar.gz qt-embedded-2.3.2.tar.gz qpe-1.4.0.tar.gz tmake-1.8.tar.gz http://www.trolltech.com
Virtual Frame Buffer X-Window의 부적합 : X-Window는 X-protocol을 이용하여 구현된 뛰어난 화면 제어 기술과 다른 유닉스 시스템들과의 호환성 등 많은 장점을 지녔지만, 큰 용량이므로 적은 용량을 요구하는 임베디드 시스템에 적용 어려움 X-Window 없이 커널 수준에서 직접 그래픽 카드의 비디오 RAM에 접근하는 방식을 사용하여 화면 제어 X-Window 화면과 프레임버퍼 Console 화면을 바꿔가면 작업하는 어려움을 피하기 위해 X-Window 상에서 프레임버퍼를 emulation하는 Virtual Frame Buffer 제공
Tmake Tmake : Trolltech에서 개발한 소프트웨어 프로젝트 툴 main.cpp hello.cpp hello.h project file main.cpp hello.cpp hello.h hello.pro hello Makefile
(Virtual Frame Buffer) GUI Application 개발 및 테스트 개발환경 및 과정 Qt/X11 설치 (Virtual Frame Buffer) Qt/E Library 설치 Qtopia 설치 ARM Qt/E Library 설치 ARM Qtopia 설치 GUI Application 개발 및 테스트 개발용 리눅스 PC 타겟 보드 개발환경 설정 과정 Tmake 설정 ARM Tmake 설정
Hello World Program #include <qapplication.h> #include <qwidget.h> #include <qpainter.h> Class MyWidget : public Qwidget { public: MyWidget(); void paintEvent(QPaintEvent*); }; MyWidget::MyWidget() { setCaption(“Hello World”); } Void MyWidget::paintEvent(QPaintEvent*) { Qpainter p(this); p.drawText(20, 20, “Hello World ~”); } int main(int argc, char **argv) { Qapplication app(argc, argv); MyWidget mw; app.setMainWidget($mw); mw.show(); return app.exec(); }
Signal & Slot #include <qapplication.h> #include <qwidget.h> #include <qlabel.h> #include <qpushbutton.h> class MyWidget : public Qwidget { public: MyWidget(); private: QPushButton* bt1; QPushButton* bt2; QLabel* lb1; }; MyWidget::MyWidget() { setCaption("Button Switch"); bt1 = new QPushButton("Text\nON", this); bt1->setGeometry(20, 40, 50, 40); bt2 = new QPushButton("Text\nOFF", this); bt2->setGeometry(80, 40, 50, 40); lb1 = new QLabel(this); lb1->setText("Signal & Slot Test... ~~"); lb1->setGeometry(20, 80, 120, 80); connect(bt1, SIGNAL(clicked()), lb1, SLOT(show())); connect(bt2, SIGNAL(clicked()), lb1, SLOT(hide())); } int main(int argc, char **argv) { Qapplication app(argc, argv); MyWidget mw; app.setMainWidget($mw); mw.show(); return app.exec(); }
Animation Clock image와 Time 처리 루틴 void AniClock::paintEvent( QPaintEvent * ) { Qpainter painter(this); drawClock(); painter.drawPixmap(0, 0, *m_ppmPaint); } painter.setBrush(QColor(255,255,255)); painter.drawRect(0, 0, width(), height()); painter.drawPixmap(QPoint(0, 0), m_pmBk); QTimer *internalTimer = new QTimer( this ); internalTimer->start(1000); connect( internalTimer, SIGNAL(timeout()), SLOT(slotTimeout()) );
Address Book PDA 전용 프로그램으로 사용자가 인명당 주소, 전화번호 등의 인적사항을 Database로 관리 Database 설치, LCD 상에서 터치스크린으로 숫자, 영문 등 입력 기능과 데이터 관리 기능 여러가지의 응용 프로그램을 설계해 보았는데 그 중에서도 PDA용으로서 사용되기에 적합한 Address Book의 설계방법을 보였습니다. 그 이유는 스크린터치 기능을 직접 시험해 볼 수 있기 때문입니다,
Address Book 주요 기능의 정보흐름 구성 yes or no 기능 선택 DB 초기화 DB 목록 보여주기 삭제 데이터 입력창 실행 데이터 입력 및 수정 DB 목록 보여주기 입력, 수정 삭제 다이얼로그 창 실행 yes or no 주요 정보흐름은 다음과 같습니다. 실제 프로그램 구현부분은 뒤에서 보이도록 하겠습니다.
Address Book DB 초기화 m_dbf = gdbm_open("address.gdbm", 2048, GDBM_WRCREAT, 00664, NULL); if (m_dbf == NULL) qDebug("gdbm_open failed, %s", gdbm_strerror(gdbm_errno)); exit(1); if (gdbm_setopt(m_dbf, GDBM_CACHESIZE, &size_cache, sizeof(int)) == -1) qDebug("gdbm_setopt failed, %s", gdbm_strerror(gdbm_errno)); 데이터입력창 실행 InfoDlg* pInfoDlg = new InfoDlg(this, "pInfoDlg", true); result = pInfoDlg->exec(); 앞에서 보였던 정보흐름 구성에 대한 실제 프로그램 코딩부분입니다. 입력한 데이터 처리 pInfoDlg->getData(&person); dt_data.dptr = (char*)&person; dt_data.dsize = sizeof(PERSON);
Address Book DB에 저장 if (gdbm_store(m_dbf, dt_key, dt_data, GDBM_REPLACE) != 0) qDebug(“Error.\n"); refresh(); 삭제 여부 확인 QMessageBox mb(tr("Delete"), tr("Do you want to delete?"), QMessageBox::Warning, QMessageBox::Yes, QMessageBox::No, 0, this); DB에서 삭제 if (gdbm_delete (m_dbf, dt_key) != 0) qDebug(“Error.\n"); refresh();
Address Book
Qtopia 실행화면