2010. 9. 6.

Chasing 틴Performance

Chasing performance

Qt Programming을 하다 보면 특정 instance나 Function에서 Resource를 많이 차지 하는 경우가 있다. 이때 어떤 루틴이 자원을 차지 하는지 찾으려고 할때 많이 사용하는 루틴

Qt Code:
  1. QTime time;
  2. time.start();
  3. // 긴 시간이 소요되는 루틴
  4. int difference = time.elapsed();

2010. 8. 26.

Screen Capture

Screen Capture 해보기

Qt에는 QDesktopWindget 이라는 Class가 있어, Application 수준이 아닌 Desktop 수준의 Operation이 가능하게 해준다.
QDesktopWidget ( http://doc.qt.nokia.com/4.6/qdesktopwidget.html )

전체 화면 Capture 예제 (클릭하시면 전체 소스 코드가 보입니다)


여기서 가장 중요한 부분은
13번째 라인의
snapshot = QPixmap::grabWindow(QApplication::desktop()->winId());

인데 grabWindow를 통해 QDesktopWidget()->winId() Desktop 화면 전체를 Capture하거나 일부 영역 혹은 grabWidget() 을 통하여 Widget 영역만 Capture할 수도 있다.

2010. 8. 9.

How to create Qt Plugins

How to create Qt plugins


Qt 는 plugin을 만드는데 2 종류의 API를 제공한다.
  • Higher-level API : Qt 자체의 extention 기능을 Plugin 하기위한 API들
    ex) custum db drive, custum text codec etc.
  • Lower-level API : Qt Application을 extending 하기 위한 API들

Topics:
  • Higher-level API: Writing Qt Extensions
  • Lower-level API: Extending Qt Application
  • Locating Plugins
  • Static Plugins


Higher-level API
Qt 자체의 기능이나 성능을 확장 혹은 변경시키고자 할때 사용되는 방법으며 Plugin 확장을 위한 Base Class들이 제공되어 지며, 이를 활용하여 새로운 Function이나 Macro를 추가해 주면 된다.


Lower-level API
Qt뿐만 아니라 plugin을 통해서 Qt Application의 기능을 확장시킬 수 있는 API들. Low-level api를 detect하고 load하는 것은 QpluginLoader를 통해서 이루어지고, lower-level plugin api는 higer-level보다 임의의 다양한 functionality가 plugin base class와 무관한 기능들도 확장 시킬 수 있다.

  • Plugin을 사용하여 Application단에서 확장하는 법

1. Plugin단에서 연결하여 사용할 수 있는, interface들을 정의하기
(classes with only pure virtual functions)
2. Qt의 meta-object system에서 interface들을 인지 할 수 있도록
Q_DECLARE_INTERFACE() macro를 사용하여 declare를 해준다.
3. Application에서 plugin을 사용할 수 있도록 QPluginLoader를 포함시킨다.
4. Plugin에서 제공되는 interface인지 아닌지 판가름 하려면 qobject_cast() 를 사용하라.

  • Plugin을 구성하는 방법
1. QObject 와 원하는 Plugin기능을 제공하는 interfaces에서 상속받은 plugin class를 Declare하라.
예) class ExtraFiltersPlugin : public QObject, public FilterInterface
2. Qt의 meta-object system에서 interface들을 인지 할 수 있도록, Q_INTERFACES() macro를 이용하라.
3. Q_EXPORT_PLUGIN2() macro를 사용하여, plugin class와 멤버들을 export 시켜라.
4. 적절한 .pro 파일을 만들어서 Plugin을 Build 시켜라.
(예를 들어 Plugin용 .pro, Applicatio용 .pro, 그리고 이 두개의 Project 묶어서 구동 시킬 수 있는 .pro 파일)




  • Example of Plugin windows (Lower-Level API)


bool SomeClassToLoadPlugin::loadPlugin()
{
QDir pluginsDir(qApp->applicationDirPath());
pluginsDir.cd("plugins");
foreach(QString fileName, pluginsDir.entryList(QDir::Files)){
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
QObject *pPlugin = pluginLoader.instance();
if(pPlugin){
m_pEchoInterface = qobject_cast
(pPlugin);
if( m_pEchoInterface ) return true;
} // end of if pPlugin
}//end of foreach

return false;
}





2010. 8. 4.

Qt의 Virtual Frame buffer : QVFB

Qt의 Virtual Frame Buffer

일반적으로 Embedded용으로 Application을 개발하거나 특정한 그래픽 환경에 맞는 application을 개발하려고 할때에는
주로 Host machine에서 개발 업무를 진행하였다가 Target으로 binary를 전송하는 방식으로 개발하게 된다.
Target machine의 자원적 제약이나 Host machine의 개발상의 편리함 때문이다.




<가상 Framebuffer 상에서 한글 입력 Test Screenshot>

2010. 8. 2.

Qt Configuration

Qt Configuration

Qt를 효율적으로 사용하기 위해서는 자신에게 가장 맞는 Configuration과 사용 목적에 가장 맞는 Compiler를 가지고 Compile하여 사용하는 것이 필요하다.

기본 설정 예제 : MyConfiguration.sh

#!/bin/sh

./configure -prefix /opt/qt -confirm-license -verbose 2>&1 | tee MyConfigure.log

make -j3 | tee MyMake.log



Embedded Device 용 기본 Arm용 설정 예제 : MyEmbeddedConfig.sh

#!/bin/sh

./configure -embedded -prefix /opt/qtEmbed -platform linux-g++ -xplatform linux-arm-g++ -arch arm

make -j3 | tee MyMake.log



Embedded Device 용 Virtual Frame Buffer 사용 Arm 설정 예제 : MyEmbeddedConfig.sh

#!/bin/sh

./configure -embedded -prefix /opt/qtEmbed -platform linux-g++ -xplatform qws/linux-arm-g++ -arch arm -qvfb

make -j3 | tee MyMake.log



Virtual Frame Buffer 는 Qt에서 직접 Frame buffer를 사용하지 않고 가상 Frame buffer 를 만들어 동작하도록 하는 모드로서 Target에 직접 Application을 구동 하지 않고 Host에서 가상 Frame buffer를 Access하도록 개발 환경을 만들어 개발하고 추후 Target에 Application을 올릴 때 유용하게 사용할 수 있다.

2010. 7. 28.

Qt Download

Qt Download 받기

공식적인 Qt Repository http://qt.gitorious.org

Qt를 Download 받을 때는 자신이 사용할 용도에 맞게 Download 받아야 하는데
여러가지 방식중에서 자신에게 알맞는 방법을 선택하여 다운로드 받기를 권장한다.
  1. SDK 로 다운로드 받아 설치하기
    일반적인 사용자에게 추천하는 방법
    Qt의 모든 기능을 다운로드 받아 놓고 사용할 때 택하는 방법

  2. Source를 다운 받아 설치하기
    어느 정도 개발의 경험이 있는 사용자에게 추천하는 방법
    특정한 제품 개발용으로 Qt를 사용하고자 하는 사용자용
    Qt를 내가 원하는 Module만 컴파일하여 사용하거나 속도 개선을 위한 Optimization이 필요한 경우
    Qt를 Embedded 환경에서 사용하고자 할 때 특히 최소 사이즈나 최고 Speed와 같이 Custom한 Qt 환경을 만들고 싶을 때

  3. Mobile Phone Application 개발용으로 Qt를 설치하고자 할 때
    Meego, Maemo, 혹은 Symbian 전용으로 Qt를 사용하고자 할 때는 아래에 기술된 Nokia Qt를 다운로드 받아서 사용하면 편리하다.
    http://www.forum.nokia.com/Develop/Qt/

다운로드 받는 방법들
  • Git 으로 Download 받기
    Git으로 다운로드 받는 경우에는 항상 최신 Update Code를 포함하여 내가 원하는 Version의코드를 받을 수 있는 장점이 있다.

    # git clone git://gitorious.org/qt/qt.git

    보안이 걸려 있는 회사 내와 같은 환경일 경우

    # git clone http://git.gitorious.org/qt/qt.git

    네트워크 환경에 따라 다르지만 필자의 경우 10여분 정도 걸려 다운로드 받았다.
    2010년 7월 현재 시간으로 보았을때 소스가 840여 MB 정도 된다.

    tip) 만일 git을 가지고 있지 않다면
    Windows : http://code.google.com/p/msysgit/downloads/list
    Linux (데미안/우분투계열) : sudo apt-get install git-core
    Linux (Redhat 계열) : yum install git-core

  • Qt SDK 다운로드 받아 사용하기
    http://qt.nokia.com/downloads 를 통해서 Download 받으면 되는데
    LGPL 로 사용할 경우에는 LGPL Tab을 선택해서
    Commecial Version을 사용할 경우는 Commercial Tab을 선택하면 된다.
    LGPL과 Commercial Version은 Source Code상으로 동일하며 이후 Qt Optimize를 설명할 때나오겠지만 Qt 원본 Source를 수정할 수 있는 권리의 차이만 있다. (L-GPL을 참조하세요)
    이때 Qt SDK를 다운로드 받으면 Full Version Qt가 다운 설치되게 된다.

  • Nokia Qt SDK 다운 받아 사용하기
    Mobile Phone Application을 개발하고자 하는 사용자는 Nokia Qt를 다운로드 받으면 개발하기 용이하다.
    http://www.forum.nokia.com/Develop/Qt/

  • Qt만 다운로드 받아 사용하기
    다른 기능 없이 Qt만 사용하거나 Optimize 하려고 할 때 선택하는 방법
    (이후 Blog에서 Qt Optimization 에 관하여 기술 될 예정이다)
    http://qt.nokia.com/downloads 를 통해서 Download 받으면 되는데
    Qt Library를 OS 종류에 맞게 Download 하면 된다.

2010. 7. 23.

Qt Frameworks

Qt Frameworks

Qt를 통하여 Application을 개발하기 위해서는 적절한 Framework를 선택하는 것이 중요합니다.
만일 Qt Programming을 처음 해 보신다면 Widget Framework로 Qt의 Signal/Slot과 Event 시스템에 익숙해 지신 다음 Graphics View Framework, Webkit View Framework, 그리고 QML등으로 사용 영역을 넓혀 보시면 좋겠습니다.

  1. Widget Framework

    단순한 Dialog Box나 Push Button 같은 Widget을 통하여 화면을 구성하는 방식
    가장 일반적인 Qt Programming 으로 알려져 있습니다.
    화면에 그려야 할 Graphical Object의 수가 많아 질수록 화면의 복잡도가 높아 질 수록 Graphics View Framework보다 느리다고 알려져 있습니다.
    QWidget *pWidget = new QWidget();  

    pWidget->show();


  2. Graphics View Framework
    (
    http://doc.qt.nokia.com/4.7-snapshot/graphicsview.html)

    QGraphicsScene과 QGraphicsView를 통하여 화면을 구성하는 Framework
    화면을 구성하는 Graphic Item들을 Indexing 하거나 추가 제거가 용이하고, 화면의 복잡도가 클수록 Widget 방식보다 빠르다고 알려져 있습니다.
    Rotate 및 Transfer가 단순합니다.
    한 개의 Scene에 여러개의 View를 구성할 수 있습니다.
     QGraphicsScene scene;  

    myPopulateScene(&scene);

    QGraphicsView view(&scene);

    view.show();


  3. Webkit View Framework

    QtWebkit Module을 통하여 화면을 Standard HTML로 구성하고 Qt Class instance를 Web View 화면에 포함시키거나 Standard HTML Element들이 Qt Signal/Slot 혹은 Event와 연동하도록 화면을 구성시키는 방식
    HTML이 standard이기 때문에 Ajax 나 java script혹은 External Language나 OS 간 호환성이 뛰어 납니다.
    http://doc.qt.nokia.com/4.7-snapshot/qwebframe.html
    http://doc.qt.nokia.com/4.6/webkit-previewer.html


  4. QML
    (
    http://doc.qt.nokia.com/4.7-snapshot/qdeclarativeexamples.html)
    XML + Java Script 와 같은 형식으로 화면을 구성하는 방식으로, 완벽히 동일하진 않지만 Qt용 Flash ActionScript라고 표현하면 어떨지 개인적으로 생각해 봅니다.
    보통 Declarative View 모듈과 함께 동작하는 경우가 많습니다.


  5. XML + Java Script 와 같은 형식으로 화면을 구성하는 방식으로, 완벽히 동일하진 않지만 Qt용 Flash ActionScript라고 표현하면 어떨지 개인적으로 생각해 봅니다. 화면 구성이 CSS나 JavaScript와 유사해서 C++ Programming이 익숙하지 않은 Web Application 개발자들이 쉽게 Qt에 접근할 수 있습니다.

    Qt Creator 2.0 이상 버전에서 개발하셔야 하고 Qt 4.7 이상 버전을 사용하실 것을 권장 합니다. Qt 4.6.3 에서도 개발은 가능하나 일부 API가 Qt 4.7 에서 추가되거나 변경된 것이 존재하므로 호환성에 문제가 있을 수 있습니다.
    Divx Player 같은 것도 50~60 라인으로 쉽게 구현가능한 것이 장점이나 특히 Embedded 환경에서 Performance를 위해 Hardware 요구 사항이 높습니다.



제가 출판하고자 하는 것이 있어 가지고 있는 소스를 바로 올려 두진 못하겠지만, 단계별로 코드를 수정하여 예제를 올려 보도록 하겠습니다. 몇개의 예제 만으로도 Qt 의 매력에 푹 빠지실 거라고 자신있게 말씀드릴 수 있습니다.

Qt 시작하기



Qt 란 무엇인가?
Qt 는 Cross-Platform Toolkit 으로 단순한 Graphical UI Toolkit 기능부터 Network/Database/Webkit등 Programmer 가 다양한 기능을 다양한 OS에서 쉽게 개발 할 수 있도록 다양한 Component를 제공하는 C++ Toolkit 이다.

Tip: Qt (큐티) 라고 쓰고, 큐트(트는 거의 들리지 않게) 라고 읽습니다.

Prerequirements of Qt
  • C++ Programming 능력
  • Design Pattern을 이해하고 사용할 수 있는 능력
지원되는 OS
  • Unix 계열 OS
    Linux, Android, Macintosh 용 OS들, BSD 계열등등 대부분의 Unix OS가 지원됩니다.
  • Windows 계열 OS
    Windows Vista, Windows XP, WinCE등등 대부분의 Windows 계열 OS가 지원됩니다.

Qt의 종류
  1. Qt
    가장 일반적인 Qt Component (Class)들로 구성되어 있습니다.
    다양한 OS에서 사용할 수 있도록 추상화가 많이 되어 있어, 이식성은 좋으나 Hardware related 가 되어야 하는 부분, 예를 들자면 Multimedia playback이나 Graphic 가속기등의 사용을 위해서는 특정 Hardware용 Plugin개발이 중요합니다.

    장점
    다양한 기능과 다양한 OS를 위해 기능들을 갖추고 있습니다. 누구나 쉽게 Qt Class등을 통하여 안정적으로 빠른 코드를 개발 할 수 있습니다.
    많은 Application 개발 Tool 로 사용되고 있습니다.
    잘 알려진 Chip에서의 Embedded용 Application 개발이 용이합니다. (예: x86, arm, mips)

    단점
    Performance 향상을 위해서 Hardware dependent 한 코드를 추가해야 할 경우가 생기면 해당 Hardware에 Optimized된 Plugin을 추가 개발 해줘야 합니다.
    Plugin 개발은 응당 Hardware optimization을 위해 당연한 것이긴 하지만 아래의 Nokia Qt나 Qtopia의 경우는 특정 칩 계열이나 특정 상품 계열을 위해서 Optimized 된 device driver등이 제공되는 것과 비교해 보면 Plugin Optimization을 위해 Resource 투자를 해야 한다는 것이 아쉬울 수 있습니다.

    Version (2010년 7월 현재)
    현재 stable version은 Qt 4.6.3 이고 develop version은 Qt 4.7 입니다.

    Tip : Qt의 추상화 영역을 간소화 하고, Hardware 가속기를 사용하실 것을 추천합니다.
    최근에는 OpenVG나 OpenGL/ ES 2.0 혹은 DirectFB등을 많이 사용합니다.
    아래 그림에서 OpenVG 윗단에 Optimized된 Plugin을 추가하여 Qt 2D API들이 최상의 성능을 낼 수 있도록 합니다.

    Image출처:
    http://www.khronos.org/openvg/


  2. Nokia Qt SDK
    위의 Qt의 경우에는 Trolltech에서 처음 만들었고 많은 Open Source 개발자 특히 KDE 개발자들의 노력으로 만들어진 집단 지성의 결정체 입니다.
    그런 만큼 다양한 분야의 여러 목적을 위해 각 Component가 Generic하게 개발되어 왔습니다. 그런데 Nokia에서 Qt를 Mobile Application 목적으로 개발한 필요가 생겼고, 이를 위해 개발되어진 것이 Nokia Qt 입니다.
    Mobile 장비를 위한 Component들이 강화된 것이 특징입니다.
    Meego, Maemo, Symbian등의 OS에 많이 Test되어 있고, Optimize 되어 있습니다.

    장점
    위의 Qt Application이 능숙하신 분이라면, 쉽게 Meego나 Maemo, Symbian같은 Mobile 장비 Application을 개발 할 수 있습니다.

    단점
    위의 Generic Qt Component와 100% 완벽하게 동일하지는 않습니다.

    Version (2010년 7월 현재)
    Stable Version은 1.0이고 Develop Version은 1.1이 출시되어 있습니다.


  3. Qtopia ( Qt extended, qpe )
    한때 Qt extended 라고 불렸던 Qtopia는 이름과 다르게 전혀 extended 하지 않습니다.
    현재로서는 Nokia에서 Qtopia에 대한 지원은 공식적으로 전혀 하지 않습니다.
    ( 몇몇 기존에 지원계약을 맺은 아주 큰 모회사등에서는 현재 까지도 지원을 받고 있습니다.)
    성능이 낮은 Chip 이거나 일반적이지 않은 비 Standard interface를 가진 Chip에서 Embedded 용 Toolkit으로 사용되고 있습니다.

    Version : Qt Extended 4.4 가 마지막 버전인데, 추천드리지 않습니다.