2011. 5. 31.

Official Qt Mobility 1.2.0 릴리스

Qt Mobility 플러그인 라이브러리가 2011년 5월 12일자로 1.2.0으로 Release 되었습니다.

Qt Mobility version 1.2.0 의 새로운 feature로 소개된 것들로는
- 기존 mobility module들의 개선 사항 추가
- Bluetooth device 와의 쉬운 integration 기능
- NFC ready device support
(Near Field Communication : 5m 이내 통신에 유용하며 RFID와 유사합니다)
- 그외 QtMessaging, QtServiceFramework, QtSensors 와 QML 지원 모듈들
http://doc.qt.nokia.com/qtmobility-1.2/index.html

다음에서 다운 로드 받아 사용하실 수 있습니다.
http://get.qt.nokia.com/qt/add-ons/qt-mobility-opensource-src-1.2.0.zip
http://get.qt.nokia.com/qt/add-ons/qt-mobility-opensource-src-1.2.0.tar.gz

Meego 사용자의 경우 : http://download.meego.com/live/devel:/qt-mtf/Trunk/
sudo zypper addrepo http://download.meego.com/live/devel:/qt-mtf/Trunk/ devel-qt-mtf
sudo zypper refresh
sudo zypper install qt-mobility
sudo zypper install qt-mobility-example

Gitorious (깃토리오스) 사용자의 경우
http://qt.gitorious.org/ 에서 Qt-mobility의 'v1.2.0' Tag를 사용하실 수 있습니다.

2011. 5. 30.

Qt Signal 과 QML function 을 연결하기

QML은 UI를 구성하는 데 편의성을 제공하기는 하지만
Native code처럼 정밀한 작업을 하거나 세밀한 조작을 할때는 답답한 부분이 상당히 있다.

그래서 UI 는 QML로 구성하고, 세밀하고 빠른 속도를 요구되어지는 부분은
Qt로 구성하는 경우가 많은데, 이때 주의해야 할 부분이 QML과 Signal/Slot을 Communicate할 수 있느냐이다.

결론부터 말하자면
rootObject() 와 QVariant를 사용해서 Signal/Slot을 QML에서도 사용할 수 있다.

조금 더 상세히 말하자면 QML 파일은 결국 QDeclarativeView를 사용하여 동작이 이루어지게 되는데, 이 QDeclarativeView를 통하여 QML Controller의 pointer를 가져 올 수 있다.

QDeclarativeView view;
view.setSource( QUrl("QML파일.qml"));

QObject *rootObject = dynamic_cast(view.rootObject());

object의 포인터를 가져 오게 되면 그 다음은 일반 Qt 프로그램과 동일 해 진다.
QObject::connect(rootObject, SIGNAL(.....), &QtClass pointer, SLOT(....));
QObject::connect(&QtClass pointer, SIGNAL(...), rootObject, SLOT(...));

그리고 QML 파일과 Qt Native 사이의 parameter는 QVariant를 통하여 전달 시키면 된다.
NativeFunction( QVariant text ); // Qt
function QMLFunction( text ) // QML

다음의 forum nokia 예제를 참조한다.
<참조>
http://wiki.forum.nokia.com/index.php/CS001625_-_Connecting_Qt_signal_to_QML_function

myclass.h

#ifndef __MYCLASS_H__
#define __MYCLASS_H__

#include <qobject>
#include <qvariant>

class MyClass : public QObject
{
Q_OBJECT

public:
MyClass() {}

public slots:
void getData() {
QString text("New data");
emit data(QVariant(text));
}

signals:
void data(QVariant data);
};

#endif

main.cpp


#include <qapplication>
#include <qgraphicsobject>
#include <qdeclarativeview>
#include "myclass.h"


int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyClass myClass;

QDeclarativeView view;
view.setSource(QUrl("./ui.qml"));
view.setResizeMode(QDeclarativeView::SizeRootObjectToView);

QObject *rootObject = dynamic_cast(view.rootObject());

QObject::connect(rootObject, SIGNAL(dataRequired()), &myClass, SLOT(getData()));
QObject::connect(&myClass, SIGNAL(data(QVariant)), rootObject, SLOT(updateData(QVariant)));

view.setGeometry(QRect(100,100,800, 480));
view.show();

return app.exec();
}


ui.qml

import Qt 4.7

Rectangle {
signal dataRequired;

function updateData(text) { dataText.text = text } // slot

anchors.fill: parent; color: "black"

Text {
id: dataText
anchors.centerIn: parent; color: "white"
}

MouseArea {
anchors.fill: parent
onClicked: dataRequired()
}
}

Qt Cross-compiling with Scratchbox2

Embedded 환경 구축을 위한 Cross-compiling은 누가 뭐래도 지루하고 따분한 일에는 틀림 없다.

특히 Qt와 같이 다양한 기능을 제공하는 Platform Cross-compile에는 더 많은 정성과 신경이 쓰인다.
게다가 Hardware 가속기능이나 멀티미디어 라이브러리를(DirectFB, D-Bus, GStreamer, OpenGL ES)
지원하기 위해서는 Optimization도 많고, Testing까지 생각한다면 Cross-compiling Tool의 사용은
선택이 아니라 필수의 항목일 수 있다.
( 하드웨어 가속기나 멀티미디어 항목은 귀찮치만 신경을 쓰면 쓸수록 Application의 성능과 연관성도 높다)

따라서 Scratchbox2를 반복적으로 쓰면서 나름 편리하다고 느껴진 방법을 정리해 보았다.

1) Scratchbox2를 Host 에 설치한다.

2) 제공된 Board SDK 를 이용하여 root image를 만든다.

3) Target rootfs 루트폴더로 이동한다.
Scratchbox2 의 sb2-init 은 반드시 targetfs 의 root에서 실행 시켜줄 것을 권장한다.
예) cd ~/Tegra2Arm/vibrante-devlite-p1138/targetfs

4) scratchbox 2 env 를 만들어 준다.
예 ) sb2-init Tegra2Qt ~/toolchains/tegra2-x.x.x/bin/arm-none-linux-gnueabi-gcc
sb2-init -c qemu-arm Tegra2QPA ~/toolchains/tegra2-x.x.x/bin/arm-none-linux-gnueabi-gcc
sb2-init [option].... [Target Name] [Compiler:specs] [secondary_compiler]

5) Scratchbox2 가상환경으로 들어 간다.
예) sb2 -t Tegra2QPA
sb2 -t [Target Name]

6) Qt Configuration

- makespec set to use host-g++ and friends (builds tools for host)
- xmakespec set to linux-g++
예) configure -platform linux-tegra2-g++ -arch arm -xplatform linux-g++ -no-neon -graphicssystem raster -opengl es2 -confirm-license -force-pkg-config
여기서 가장 중요한 요소는 -force-pkg-config 인데, opengl es2나 dbus driver들이 제대로 맞물릴 수 있도록
해당 Target pkgconfig 위치가 $PKG_CONFIG_PATH를 정확히 지정 할 수 있도록 한다.


# # qmake configuration for linux-g++ #

MAKEFILE_GENERATOR = UNIX

TEMPLATE = app

CONFIG += qt warn_on release incremental link_prl

QT += core gui

QMAKE_INCREMENTAL_STYLE = sublib

include(../../common/g++.conf)

include(../../common/linux.conf)

# modifications to g++.conf

QMAKE_CC = sb2 gcc

QMAKE_CXX = sb2 g++

QMAKE_LINK = sb2 g++

QMAKE_LINK_SHLIB = sb2 g++

# modifications to linux.conf

QMAKE_AR = sb2 ar cqs

QMAKE_OBJCOPY = sb2 objcopy

QMAKE_STRIP = sb2 strip

load(qt_config)



- force-pkg-config (we are still cross compiling and hence have to explicitly enable pkg-config use )
export PKG_CONFIG_PATH=$TARGET_DIR/usr/lib:$TARGET_DIR/usr/local/lib



2011. 5. 27.

QML 에서 mp3 file playback



QML은 Qt 용 Application 개발시 UI의 요소를 빨리 개발하기 위한 Markup 언어로,
iPhone이나 Cocoa 개발시 사용되는 xib 파일과 비슷한 개념이라고 생각할 수 있다.

QML에서 mp3 file playback은 다음과 같이 간단히 만들수 있는데

예제는 QDeclarativeView를 이용해서 Binary 실행 파일의 일부로 만들어 주거나
# qmlviewer main.qml
과 같이 실행 시켜 주면 된다.

19줄로 만드는 mp3 player 는 backend가 필요한데
backend는 Qt-mobility 와 OS 별 multimedia backend가 필요하다

OS 별 multimedia backend
예) GStreamer , DirectShow, QuickTime 등




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 에서 확인 하실 수 있습니다.