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;
}





댓글 없음:

댓글 쓰기