2011. 8. 4.
Qt embedded 에서 DirectFB를 통한 Graphical 출력
Configure option에서
# configure "-qpa" ......
을 추가해서 Compile 한 후
# ./qt-application -platform directfb
라고 해주면 qt가 DirectFB를 통해서 출력된다.
하지만 Qt 4.7.x 버전대의 DirectFB를 통한 출력은 다음과 같다.
MyConfigure.sh
export QT_CFLAGS_DIRECTFB="-I/DirectFB설치된Path/include/directfb -D_REENTRANT"
export QT_LIBS_DIRECTFB="-L/DirectFB설치된Path/lib -ldirectfb -lfusion -ldirect -lpthread"
./configure -embedded mips/arm ....
반드시 확인해야할 사항은 -I"path"로 지정한 path에 direct.h가 존재하는지
-L"path"로 지정한 path에 libdirect-xx.xx-1.x.so.0.0 이나 libdirectfb-xx.xx-x.x.so 같은 파일이 존재 하는지 확인해야 한다.
만일 존재하지 않으면 qt compile시 DirectFBError / DirectFBErrorString 같은 것이 refer되지 않는다고 error 처리 된다.
실행시
# ./qt-application -qws -display directfb
와 같이 하면 되는데
실행시 qt rendering이 DirectFB를 통하여 출력되는 것은 stdout을 통하여서도 확인할 수 있다.
2011. 7. 12.
Qt 4.8 설치하기 (Qt Lighthouse)
실제 Qt repository로 들어가게 되었다.
이말의 의미는 Qt 4.8에는 Lighthouse처럼 Qt가 X library나 X windows를 거치지 않고,
직접적으로 Kernel을 통하여 Rendering이 가능하게 된다는 의미가 된다.
따라서 기존에 쓰이는 lighthouse git (git://gitorious.org/+qt-developers/qt/lighthouse.git) 은 더이상 쓰이지 않게 되었으며, 그냥 역사적의미로만 남겨둔다고 한다.
git clone git://gitorious.org/qt/qt.git qt cd qt
git remote add qt git://gitorious.org/qt/qt.git git fetch qt git checkout -b my-local-tracking-branch qt/4.8
2011. 6. 27.
Android 용 Qt Framework compile 하는 방법
- 최신의 Official Android NDK를 다운로드 하고 설치한다.
- 최신의 Official Android SDK를 다운로드 하고 설치한다.
Android-lighthouse Repository를 Gitorious clone(gitorious에 대한 정보는 Googling해 보시길)
# git clone git://gitorious.org/~taipan/qt/android-lighthouse.git
Prepare & compile Qt
"Qt android-lighthouse" git clone시킨 폴더로 이동하여 "androidconfigbuild.sh"을 실행시킨다.
"androidconfigbuild.sh"을 기존의 qt configure와 동일한 역할을 하며, Qt를 처음 설치할때 한번만 실행시켜 주면 된다.
# cd /path/to/cloneOfandroid-lighthouse/,
# ./androidconfigbuild.sh -n "Android NDK를 설치한 폴더 절대경로" -q 1
만일 이미 설치 환경과 개발 framework가 구성되어 있는 상태에서 Qt만 컴파일 하기를 원한다면 아래와 같이 "-q 1" option을 제거하여 주면 된다.
# ./androidconfigbuild.sh -n "Android NDK를 설치한 폴더 절대 경로"
Android용 Qt-lighthouse 의 컴파일이 완료되면 컴파일된 Qt Library를 Android Device에 넣어 주어야 하는데 다음과 같은 방식으로 QtCreator를 이용하면 된다.
Target 에서 Testing 개발 중일 경우에는
use device Qt library를 check해서 사용
Deploy를 원할 경우에는 Projects->Android (run tab)->Deploy configurations->Deploy local qt libs 옵션 사용
--------------------------------------------------------------------------------
androidconfigbuild.sh 은 아래와 같은 파라메터를 이용할 수 있다.
"androidconfigbuild.sh -p " 를 통하면 아래와 같은 help를 읽을 수 있다.
usage: ./androidconfigbuild.sh options
OPTIONS:
-p Shows this message
-c Clean qt
-q Qt build options
0 - don't configure qt (only compile) default
1 - configure qt and compile qt
-b Build qt
0 - don't build
1 - build
-s Install qt
0 - don't install
1 - install
-n NDK root. Default "/usr/local/android-ndk-r5b"
-o NDK host. Default "linux-x86"
-f NDK toolchain prefix. Default "arm-linux-androideabi"
-v NDK toolchain version. Default "4.4.3"
-a Target cpu architecture. Default "armeabi"
armeabi - tune for android arm v5
armeabi-v7a - tune for android arm v7
Optional name suffix: v5/v7
-h Shared
0 - Build static version of qt
1 - Build shared version of qt
-x Exceptions options
0 - don't use exceptions (you won't be able to build qtcreator with such a qt though)
1 - use exceptions
Optional name suffix: Xc/Nx
-d Build debug qt
Optional name suffix: D/R/DaR
-r Build release qt
Optional name suffix: R/D/DaR
-m Modify install path according to passed in options (name suffixes applied in above listed order).
-i Install path. Default "/home/your-name/path/to/android-lighthouse"
2011. 5. 26.
Tegra 2 (vibrante)에 Qt Lighthouse 올리기 (1) SDK 설치
기본적으로 vibrante는 두가지 Graphic Output모드를 지원합니다.
하나는 X11을 기본으로 하는 모드고 다른 하나는 OpenKODE를 기본으로 하는 모드입니다.
vibrante-devlite-p1138-15.0105-nv-minimal-sdk.run 를 설치하실 때 유의 하셔야 하는 사항은 "X11"의 설치인데, 현재까지는 Qt의 모든 기능을 문제 없이 사용하시고자 할때는 X11을 설치 하셔야 합니다.
하지만 이번 연재는 Qt Lighthouse를 사용하는 것이 목적이므로 OpenKODE를 설치하는 것을 기본으로 전제합니다.
참고로 Lighthouse는 qws와 달리 X를 거치지 않고 /dev/fb0로 바로 출력 할 수도 있습니다. (platform설정에 따라...)
위 패키지 설치 중 아래와 같은 메시지를 볼 수 있습니다.
Note that X11 is required for Qt and GStreamer. Enter [X] to install X11-enabled drivers and a minimal X server, any other key to skip X11 and use non-X11 (OpenKODE) drivers:
2010. 9. 6.
Chasing 틴Performance
QTime time; time.start(); // 긴 시간이 소요되는 루틴 int difference = time.elapsed();
2010. 8. 26.
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());
2010. 8. 9.
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단에서 확장하는 법
(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을 구성하는 방법
예) 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
일반적으로 Embedded용으로 Application을 개발하거나 특정한 그래픽 환경에 맞는 application을 개발하려고 할때에는
주로 Host machine에서 개발 업무를 진행하였다가 Target으로 binary를 전송하는 방식으로 개발하게 된다.
Target machine의 자원적 제약이나 Host machine의 개발상의 편리함 때문이다.
2010. 8. 2.
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
- SDK 로 다운로드 받아 설치하기
일반적인 사용자에게 추천하는 방법
Qt의 모든 기능을 다운로드 받아 놓고 사용할 때 택하는 방법 - Source를 다운 받아 설치하기
어느 정도 개발의 경험이 있는 사용자에게 추천하는 방법
특정한 제품 개발용으로 Qt를 사용하고자 하는 사용자용
Qt를 내가 원하는 Module만 컴파일하여 사용하거나 속도 개선을 위한 Optimization이 필요한 경우
Qt를 Embedded 환경에서 사용하고자 할 때 특히 최소 사이즈나 최고 Speed와 같이 Custom한 Qt 환경을 만들고 싶을 때 - 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
- Widget Framework
단순한 Dialog Box나 Push Button 같은 Widget을 통하여 화면을 구성하는 방식
가장 일반적인 Qt Programming 으로 알려져 있습니다.
화면에 그려야 할 Graphical Object의 수가 많아 질수록 화면의 복잡도가 높아 질 수록 Graphics View Framework보다 느리다고 알려져 있습니다.QWidget *pWidget = new QWidget();
pWidget->show();
- 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();
- 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 - QML
(http://doc.qt.nokia.com/4.7-snapshot/qdeclarativeexamples.html)
XML + Java Script 와 같은 형식으로 화면을 구성하는 방식으로, 완벽히 동일하진 않지만 Qt용 Flash ActionScript라고 표현하면 어떨지 개인적으로 생각해 봅니다.
보통 Declarative View 모듈과 함께 동작하는 경우가 많습니다.
Qt Creator 2.0 이상 버전에서 개발하셔야 하고 Qt 4.7 이상 버전을 사용하실 것을 권장 합니다. Qt 4.6.3 에서도 개발은 가능하나 일부 API가 Qt 4.7 에서 추가되거나 변경된 것이 존재하므로 호환성에 문제가 있을 수 있습니다.
Divx Player 같은 것도 50~60 라인으로 쉽게 구현가능한 것이 장점이나 특히 Embedded 환경에서 Performance를 위해 Hardware 요구 사항이 높습니다.
Qt 시작하기
- C++ Programming 능력
- Design Pattern을 이해하고 사용할 수 있는 능력
- Unix 계열 OS
Linux, Android, Macintosh 용 OS들, BSD 계열등등 대부분의 Unix OS가 지원됩니다. - Windows 계열 OS
Windows Vista, Windows XP, WinCE등등 대부분의 Windows 계열 OS가 지원됩니다.
- 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/ - 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이 출시되어 있습니다. - Qtopia ( Qt extended, qpe )
한때 Qt extended 라고 불렸던 Qtopia는 이름과 다르게 전혀 extended 하지 않습니다.
현재로서는 Nokia에서 Qtopia에 대한 지원은 공식적으로 전혀 하지 않습니다.
( 몇몇 기존에 지원계약을 맺은 아주 큰 모회사등에서는 현재 까지도 지원을 받고 있습니다.)
성능이 낮은 Chip 이거나 일반적이지 않은 비 Standard interface를 가진 Chip에서 Embedded 용 Toolkit으로 사용되고 있습니다.
Version : Qt Extended 4.4 가 마지막 버전인데, 추천드리지 않습니다.

