QtCreator源码学习——PluginManager分解(4)
看名字大概就能看出来这个类的主要作用是管理插件,该类包含在ExtensionSystem命名空间中,在该命名空间中还包含一个小的命名空间Internal,Internal中包含PluginManagerPrivate类如下图所示:#mermaid-svg-JPaZ3pcLdSSnc8rM .label{font-family:'trebuchet ms', verdana, arial;font-
·
看名字大概就能看出来这个类的主要作用是管理插件,该类包含在ExtensionSystem命名空间中,在该命名空间中还包含一个命名空间Internal,Internal中包含PluginManagerPrivate类
如下图所示:
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函数调用流程简单如下:
- 设置参数文件后缀名
- 设置插件路径
- 读插件路径
- 解析插件
- 解析依赖项
这里有个关键的方法,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属性。
更多推荐


所有评论(0)