2011. 5. 26.

Tegra 2 (vibrante)에 Qt Lighthouse 올리기 (1) SDK 설치

Tegra2 vibrante Board 에 Qt Lighthouse (QPA) 올리기

SDK Installation
가장 먼저 필요한 작업은 SDK 설치이겠지요.
다음과 같은 방법으로 하시면 됩니다.

# unzip vibrante-devlite-p1138-15.0105-minimal-sdk.zip
여러 패키지 들이 딸려 나오지만 그중 가장 중요한 2가지만 선택하시면 됩니다.
그 외엔 개발자들의 취향에 따라 쓸 수도 있고, 쓰지 않을 수도 있으므로 패스

# chmod u+x *.run
# ./vibrante-devlite-p1138-15.0105-oss-minimal-sdk.run
설치와 라이센스 동의를 하게 되면 다음의 작업들을 해주게 됩니다.
- toolchain 설치
- xinetd, tftpd와 같은 package 설치
- 그외 dhcp나 nfs 관련한 package 설치 및 설정

Now installing tegra2-ubuntu-minimal-lucid.tgz to ./vibrante-devlite-p1138/targetfs Installing dev debian packages for alsa... Unpacking /home/codeguru/Tegra2Lighthouse/vibrante-devlite-p1138/targetfs-pkgs/minimal/tegra2-ubuntu-minimal-lucid.tgz to ./vibrante-devlite-p1138/targetfs.
[sudo] password for codeguru:

# ./vibrante-devlite-p1138-15.0105-nv-minimal-sdk.run

기본적으로 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:


여기까지 설치했다면 SDK설치 완료

2011. 5. 6.

Qt SDK 1.1 (Qt 4.7.3) Release

Qt SDK 1.1 이 Release 되었습니다.

특징으로는 Qt 4.7.3을 기본으로 사용하고 있다는 것이구요.
Qt 4.7.3을 쓴다는 의미는 Nokia에서 강력하게 밀고 있는 QML (Qt Quick) Feature들을 기본으로 사용할 수 있게 되었다는 것이구요.
그리고 기존에는 Mobile용과 Desktop용이 구분되던 Qt가 Qt SDK 1.1을 기점으로 두버전이 한개 버전으로 합쳐졌다는 것이 가장 큰 특징이라고 할 수 있습니다.

http://qt.nokia.com/downloads 에서 확인 하실 수 있습니다.

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을 올릴 때 유용하게 사용할 수 있다.