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