Qt/Embedded & Qtopia
목 차목 차 1.Embedded Linux GUI Toolkit 2.Qt/Embedded 3.Qtopia 4.Virtual Frame Buffer 5. 개발환경 및 과정 6.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 버전은 beta1 까지 제공되고 있으며, 적용 버전은 버전 사용 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-x tar.gz –qt-embedded tar.gz –qpe tar.gz –tmake-1.8.tar.gz
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 main.cpp hello.cpp hello.h hello.pro hello project file Makefile
개발환경 및 과정 Qt/X11 설치 (Virtual Frame Buffer) 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 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 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 상에서 터치스크린으로 숫자, 영문 등 입력 기능과 데이터 관리 기능
Address Book 주요 기능의 정보흐름 구성 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)); exit(1); 데이터입력창 실행 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 실행화면