[Qt] QtCreator 소스를 통해 Qt 배우기 (4): 플러그인 관리 Plugin Manager

8985 단어 Qt
1. 소개
QtCreator는 플러그인 아키텍처를 사용하여 손쉽게 확장할 수 있습니다.핵심은 플러그인 관리이고 기본 클래스는 Plugin Manager입니다.다음은 src\libs\extensionsystem\pluginmanager 번역입니다.cpp에서 플러그인에 대한 설명은 다음에 플러그인 관리 코드를 상세하게 분석할 것입니다.
2. 이름 공간, 주요 유형 소개
플러그인이 사용하는 이름 공간은namespace:ExtensionSystem: 핵심 플러그인 시스템에 속하는 클래스를 제공합니다.ExtensionSystem에는 플러그인 관리자와 지원 클래스, 플러그인 공급자가 구현해야 하는 IPlugin 인터페이스가 포함되어 있습니다.
class ExtensionSystem::Plugin Manager: 기본 클래스 Plugin Manager 클래스는 플러그인 자체와 그들의 상태, 생명 주기, 등록된 대상에 대한 관리를 포함한 핵심 플러그인 시스템을 실현했다.
3. 플러그인
플러그인은 XML 설명자 파일과 Qt 플러그인을 포함하는 라이브러리로 구성되어 있으며 IPlugin 클래스에서 파생되어야 하며 IID는 "org.qt-project.Qt.QtCreatorPlugin"입니다.플러그인 관리자는 경로 목록을 통해 플러그인을 검색하고 플러그인 상태에 대한 정보를 검색하며 불러옵니다.일반적으로 플러그인 관리자는 하나만 필요하기 때문에 프로그램에 Plugin Manager 실례를 만들고 로드를 시작합니다.플러그인을 불러오는 절차: 플러그인 경로 목록을 설정하고 모든 플러그인을 불러오려면: PluginManager::setPluginPaths(QStringList("plugins");PluginManager::loadPlugins();//try to load all the plugins
또한 플러그인 사양(설명 파일의 정보), 플러그인 인스턴스(Pluginspec를 통해) 및 해당 상태에 직접 액세스할 수 있습니다.
4. 개체 풀
플러그 인은 플러그 인 관리자의 공통 풀에 객체를 추가할 수 있습니다.풀의 객체는 다른 필수조건 없이 QObject에서 파생되어야 합니다.대상은 getobject()와 getobjectByName() 함수를 통해 대상 탱크에서 검색할 수 있습니다.개체 풀의 상태가 변경되면 플러그인 관리자가 해당 신호를 보냅니다.
대상 탱크의 흔한 용도는 플러그인(또는 응용 프로그램)이 다른 플러그인에'확장점'을 제공하는 것이다. 이것은 대상 탱크에 구현되고 추가할 수 있는 클래스/인터페이스이다.확장점을 제공하는 플러그인은 대상 탱크에서 클래스/인터페이스를 찾습니다.코드 구현: {//플러그인 A는 "MimeTypeHandler"확장점을 제공했다//플러그인 B: MyMimeTypeHandler *handler = new MyMimeTypeHandler (), PluginManager:::instance () ->addObject (handler),//플러그인 A: MimeTypeHandler *mimeHandler = PluginManager: getObject ();
ExtensionSystem: Invoker 클래스 템플릿은 '소프트' 확장점을 사용하기 위해 '문법 설탕' 을 제공합니다. 이 확장점은 연못의 대상에게 제공될 수도 있고 아닐 수도 있습니다.이런 방법은 '사용자' 플러그인을 '공급자' 플러그인에 연결할 필요도, 공공 공유 헤더 파일도 필요 없다.공개된 인터페이스는 대상 탱크의 '공급자' 대상의 호출 가능한 함수에 의해 은밀하게 제공된다.코드 예:
{
 //  “  ”  A :
 namespace PluginA {
 class SomeProvider : public QObject
 {
    Q_OBJECT

 public:
    Q_INVOKABLE QString doit(const QString &msg, int n)
    {
        qDebug() << "I AM DOING IT " << msg;
        return QString::number(n);
    }
 };
 } // namespace PluginA


 //  “  ”  B :
 int someFuntionUsingPluginA()
 {
    using namespace ExtensionSystem;

    QObject *target = PluginManager::getObjectByClassName("PluginA::SomeProvider");

    if (target) {
        //       。
        QString msg = "REALLY.";

        //       ,     。
        invoke<void>(target, "doit", msg, 2);
        //          。
        qDebug() << "Result: " << invoke<QString>(target, "doit", msg, 21);

        //             。
        Invoker<QString> in1(target, "doit", msg, 21);
        qDebug() << "Success: (expected)" << in1.wasSuccessful();
        // T          。
        Invoker<QString> in2(target, "doitWrong", msg, 22);
        qDebug() << "Success (not expected):" << in2.wasSuccessful();

    } else {
        //       A   。
    }
 };
}

주의사항: invoke () 호출에 전달되는 매개 변수의 유형은 매개 변수 자체에서 유도되며 호출된 함수의 매개 변수 유형과 일치해야 합니다.대상 탱크 조작 함수는 라인이 안전하다.
5. 플러그인 함수 설명
void PluginManager::objectAdded(QObject*obj): 플러그인 풀에 객체 추가
void PluginManager::aboutToRemoveObject(QObject*obj):플러그인 풀에서 객체 제거
void PluginManager::pluginsChanged(): 사용 가능한 플러그 인 목록이 변경되었습니다.
T *PluginManager::getObject(): 객체 풀에서 지정된 유형의 객체를 읽어들입니다.함수 사용 qobjectcast에서 대상의 유형을 정합니다.객체 풀에 지정된 유형의 객체가 여러 개 있는 경우 함수 중 하나를 선택합니다.
T *PluginManager: getObject(Predicate predicate): 객체 풀에서 지정된 predicate 유형의 객체를 읽어들입니다.이 함수는 qobject 를 사용합니다cast에서 대상의 유형을 정합니다.predicate는 T*를 적용하고 bool을 반환하는 함수여야 합니다.객체 일치 유형이 여러 개인 경우 함수 중 하나를 선택합니다.

좋은 웹페이지 즐겨찾기