看名字大概就能看出来这个类的主要作用是管理插件,该类包含在ExtensionSystem命名空间中,在该命名空间中还包含一个命名空间InternalInternal中包含PluginManagerPrivate

如下图所示:

namespace ExtensionSystem
namespace Internal
class IPlugin
class PluginSpec
class PluginManager
class PluginManagerPrivate
class PluginSpecPrivate
class IPluginPrivate

instance()

//pluginmanager.h
public:
    static PluginManager *instance();
//pluginmanager.h
//防止在使用静态函数时返回野指针. 2021-01-12 https://blog.csdn.net/Bing_Lee
PluginManager *PluginManager::m_instance = 0;

/*!
    \fn PluginManager *PluginManager::instance()
    Get the unique plugin manager instance.
*/
PluginManager *PluginManager::instance()
{
    return m_instance;
}

返回PluginManager对象指针。

PluginManager函数调用流程简单如下:

  1. 设置参数文件后缀名
  2. 设置插件路径
    1. 读插件路径
    2. 解析插件
    3. 解析依赖项

这里有个关键的方法,Qt中非常常见的d指针。

//pluginmanager.cpp

/*!
    \fn PluginManager::PluginManager()
    Create a plugin manager. Should be done only once per application.
*/
PluginManager::PluginManager()
    : d(new PluginManagerPrivate(this))
{
    m_instance = this;
}

//pluginmanager.h
class EXTENSIONSYSTEM_EXPORT PluginManager : public QObject
{
    Q_DISABLE_COPY(PluginManager)
    Q_OBJECT
    /*
    ...
    */
private:
    Internal::PluginManagerPrivate *d;
    static PluginManager *m_instance;
    mutable QReadWriteLock m_lock;

    friend class Internal::PluginManagerPrivate;
};

对于d指针可以参考《Qt之美(一):d指针/p指针详解》1了解。

d指针简单示例

// myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QtCore/QObject>
class MyClassPrivate;
class MyClass: public QObject
{
  Q_OBJECT
public:
  MyClass(QObject *parent = 0);
  virtual ~MyClass();
  void dummyFunc();
signal:
  void dummySignal();
private:
  MyClassPrivate * const d_ptr;
  Q_DECLARE_PRIVATE(MyClass);
  Q_DISABLE_COPY(MyClass);
};
#endif // MYCLASS_H
// myclass.cpp
#include "myclass.h"
class MyClassPrivate
{
public:
  MyClassPrivate(MyClass *parent)
    : q_ptr(parent)
  {
  }
  void foobar()
  {
    Q_Q(MyClass);
    emit q->dummySignal();
  }
private:
  MyClass * const q_ptr;
  Q_DECLARE_PUBLIC(MyClass);
};
MyClass::MyClass(QObject *parent)
  : QObject(parent)
  , d_ptr(new MyClassPrivate(this))
{
}
MyClass::~MyClass()
{
  Q_D(MyClass);
  delete d;
}
void MyClass::dummyFunc()
{
  Q_D(MyClass);
  d->foobar();
}

注意:
往往private函数中除了私自使用的函数和q指针外,变量和外部可调用的函数均是public属性。


  1. Qt之美(一):d指针/p指针详解 ↩︎

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐