Qt Creator 소스 분석 제품군 - extensionsystem::IPlugin
10442 단어 컴퓨터 그래픽 프로그래밍
IPlugin 클래스는 모든 플러그인의 기본 클래스입니다.IPlugin 클래스는 모든 플러그인에 대해 한 번씩 실행해야 하는 추상적인 클래스입니다.플러그인은 두 부분으로 구성되어 있습니다. 하나는 설명 파일이고 하나는 IPlugin이 실행된 라이브러리입니다.플러그인 규격Specification: 플러그인은 실제 플러그인 라이브러리 외에 플러그인 관리자가 플러그인을 찾아서 의존 관계를 해결하고 불러올 수 있도록 플러그인 규범 파일을 제공해야 합니다.플러그인 구현 Implementation: 플러그인은 XML 설명에 제시된name 속성과 일치하는 라이브러리에 있는 IPlugin 클래스를 제공해야 합니다.I 필요ID가 "org.qt-project.Qt.QtCreatorPlugin"으로 설정된 QPLUGIN_METADATA 매크로는 IPlugin을 Qt의 플러그인 시스템으로 내보내고 알려줍니다.플러그인의 XML 파일을 읽고 의존 항목을 찾으면 플러그인 불러오는 세 단계로 나뉜다. 모든 플러그인 라이브러리는 트리에 의존하는 루트-to-leaf 순서로 불러옵니다.모든 플러그인의 initialize 초기화 함수는 트리에 의존하는 루트-to-leaf 순서로 호출됩니다.지금은 다른 플러그인을 만드는 데 필요한 대상을 만들고 적당한 핵심 기능을 통해 등록할 수 있는 좋은 시기이며, 약한 의존성을 실현하려면 전역 대상 탱크에 넣을 수 있다.모든 플러그인의 extensionsInitialized 확장자 초기화 함수는 트리에 의존하는leaf-to-roo} 순서로 호출됩니다.이 때 플러그인은 이 플러그인에 의존하는 모든 플러그인을 완전히 초기화하고 공유할 대상이 등록되었거나 전역 대상 풀에서 사용할 수 있도록 합니다.라이브러리를 불러오거나 플러그인을 초기화하는 데 실패하면, 이 플러그인에 의존하는 모든 플러그인도 실패합니다.
class IPluginPrivate
{
public:
PluginSpec *pluginSpec;
};
IPlugin 클래스의 구조 함수는 주로 IPluginPrivate 포인터 구성원을 초기화하는 것입니다.위의 IPluginPrivate 클래스 정의에 따라 PluginSpec 포인터(플러그인 사양 Specification)가 정의됩니다.
class EXTENSIONSYSTEM_EXPORT IPlugin : public QObject
{
Q_OBJECT
public:
enum ShutdownFlag { SynchronousShutdown, AsynchronousShutdown };
IPlugin() : d(new Internal::IPluginPrivate()) {};
~IPlugin() override;
virtual bool initialize(const QStringList &arguments, QString *errorString) = 0;
virtual void extensionsInitialized() = 0;
virtual bool delayedInitialize() { return false; }
virtual ShutdownFlag aboutToShutdown() { return SynchronousShutdown; }
virtual QObject *remoteCommand(const QStringList & /* options */, const QString & /* workingDirectory */, const QStringList & /* arguments */) { return nullptr; }
virtual QVector<QObject *> createTestObjects() const;
PluginSpec *pluginSpec() const;
signals:
void asynchronousShutdownFinished();
private:
Internal::IPluginPrivate *d;
friend class Internal::PluginSpecPrivate;
};
초기화
4
bool IPlugin::initialize(const QStringList &arguments, QString *errorString)
플러그인을 로드하고 IPlugin 인스턴스를 만든 후 호출합니다.이 플러그인의 초기화 함수를 호출하면 이 플러그인에 의존하는 플러그인의 초기화 함수를 호출합니다.플러그인은 이 함수에서 내부 상태를 초기화해야 합니다.초기화에 성공하면 되돌아옵니다.만약 성공하지 못하면, errorString을 사용자가 읽을 수 있는 원인을 설명하는 메시지로 설정해야 합니다void IPlugin::extensionsInitialized()
IPlugin::initialize 함수를 호출한 후 이 플러그인에 의존하는 플러그인의 IPlugin::initialize와 IPlugin::extensions Initialized 함수를 호출한 후 이 방법을 호출합니다.이 기능에서 플러그인은 이 플러그인에 의존하는 플러그인이 완전히 '시작하고 실행 중' 이라고 가정할 수 있습니다.전역 대상 탱크에서 약한 의존 플러그인이 제공하는 대상을 찾기 좋은 곳입니다bool IPlugin::delayedInitialize()
모든 플러그인의 IPlugin:::extensions Initialized 함수가 호출된 후, 이 플러그인에 의존하는 플러그인의 IPlugin::delayed Initialize 함수가 호출된 후에 호출됩니다.플러그인의 delayInitialize 함수는 프로그램이 실행된 후에 호출됩니다. 몇 밀리초 동안 프로그램 시작이 지연되고, 각delayInitialize 함수 호출이 지연됩니다.불필요한 지연을 피하기 위해서, 만약 플러그인이 실제적으로 이 기능을 실현한다면, 이 플러그인은 다음 플러그인의 delayInitialize () 호출을 몇 밀리초 늦추어 입력과 그림 이벤트가 처리될 수 있도록 이 함수에서true로 되돌아와야 한다.플러그인이 비평범한 설정인non-trivial setup을 실행해야 한다면 (시작할 때 직접 완성해야 하는 것은 아니지만 짧은 시간 안에 완성해야 함) 이 기능을 사용할 수 있습니다.이것은 많은 펠트 플러그인/응용 프로그램의 시작 시간을 매우 쉽게 줄일 수 있다IPlugin::ShutdownFlag IPlugin::aboutToShutdown()
시퀀스를 닫는 동안 초기화와 같은 순서로 호출한 다음 반대로 플러그인을 삭제합니다.일반적으로 이 기능은 다른 플러그인과 연결을 끊고 모든 UI를 숨기고 전원을 끄는 데 사용됩니다.플러그인이 실제 닫기를 지연해야 할 경우, 예를 들어 외부 프로세스가 깨끗하게 닫히기를 기다려야 할 경우, 플러그인은 이 함수에서 IPlugin:::AsynchronousShutdown으로 되돌아갈 수 있습니다.aboutToShutdown () 서열이 완성된 후, 모든 요청한 플러그인이 asynchronousShutdown () 신호를 보낼 때까지 주 이벤트를 순환 상태로 유지합니다.이 함수의 기본값은 아무 작업도 수행하지 않고 IPlugin: SynchronousShutdown으로 돌아갑니다.플러그인이 종료 작업을 수행하기 전에 비동기식 작업을 수행해야 하는 경우 IPlugin::AsynchronousShutdown으로 돌아갑니다QObject *IPlugin::remoteCommand(const QStringList &options, const QStringList &arguments)
다른\QC 실례가 실행 중일 때 -client 파라미터를 사용하여\QC를 실행하면 실행 중인 실례에서 이 플러그인 기능을 호출합니다.플러그인별 매개 변수는\a 옵션에서 전달되고 나머지 매개 변수는\a 매개 변수에서 전달됩니다.-block를 사용하면 제거할 때까지 차단 명령을 반환합니다void IPlugin::asynchronousShutdownFinished()
비동기적으로 닫기를 준비한 후 닫기 시퀀스를 계속 실행할 준비가 되면 플러그인으로 발송합니다.QVector<QObject *> IPlugin::createTestObjects() const
{
return {};
}
QTest::qExec()에 전달할 객체를 반환합니다.사용자가'-test PluginName'또는'-test all'로\QC를 시작하면 이 함수가 호출됩니다.대상의 소유권을 호출자에게 되돌려줍니다.
PluginSpec *IPlugin::pluginSpec() const
{
return d->pluginSpec;
}
플러그 인에 해당하는 PluginSpec을 반환합니다.이것은 구조 함수에서 사용할 수 없다.