按需加载,资源不浪费,问题不易出。
接口尽可能的简单,实现尽可能的简单,仅为所需功能,不做过度设计与冗余实现。
实现插件管理及共有接口。
class GDCORE_EXPORT GDPObject : public QObject
{
Q_OBJECT
public:
virtual int type() const = 0; /* GDO_Type 插件类型 */
virtual unsigned int version() const = 0; /* 插件版本 */
virtual QString author() const; /* 插件作者 */
virtual bool init() = 0; /* 初始化, 可有可无, 由插件决定 */
QString fileName() const; /* 插件文件 */
QString name() const; /* 插件名称, 简单的描述 */
QString metaIID() const; /* 插件meta ID */
static QList<QPair<QString/*iid*/, QString/*path*/> > metaInfo(const QString &dir, const QString &filter); /* 获取符合过滤条件的插件文件的ID和文件路径 */
static GDPObject* load(const QString &file, QObject *parent = nullptr); /* 加载插件对象, 一个插件仅有一个对象 */
static void unload(GDPObject *obj); /* owner delete, also the obj itself will be deleted */
signals:
void error(const QString &); /* 插件生存期间的错误信息向外输出 */
protected slots:
void postError(const QString &msg, int err = 0); /* 插件生存期间的错误信息格式化输出 */
protected:
explicit GDPObject(QObject *parent = nullptr) : QObject(parent), owner(nullptr)
{} /* 用户不能显式的构造与析构一个插件对象 */
virtual ~GDPObject() {} /* Call unload() instead */
private:
void deleteLater();
private:
class GDPObjOwner;
GDPObjOwner *owner; /* owner销毁时, 对象亦被效率 */
};
当前实现的音频播放接口有:Fmod ex、Bass、ffmpeg、Qt Multimedia、Qt phonon,推荐使用Bass或ffmpeg,这两个引擎支持的音频格式最多,考虑资源占用(内存使用大小)推荐使用Bass。
class GDPAudioPlayer : public GDPObject
{
Q_OBJECT
public:
explicit GDPAudioPlayer(QObject *parent = nullptr) : GDPObject(parent)
{}
virtual ~GDPAudioPlayer()
{}
int type() const { return GDOT_AudioPlayer; }
unsigned int version() const { return GDP_GENVER(1); }
/* 正在进行音频播放吗? */
virtual bool isPlaying() const = 0;
public slots:
virtual bool play(const QByteArray &audioBuffer) = 0; /* 播放音频缓存 */
virtual bool playFile(const QString &file) = 0; /* 播放音频文件 */
virtual void stop() = 0; /* 停止播放当前音频(同时释放音频占用的资源) */
};
当前实现的OCR接口有:Nicomsoft OCR、Tesseract、Apple’s Vision framework,Nicomsoft官方已放弃维护且支持的平台和识别语言都少,推荐使用Tesseract。
class GDPOcrText : public GDPObject
{
Q_OBJECT
public:
/* OCR 语言列表,id用于ocr引擎的语言识别标志,name为名称 */
typedef QList<QPair<QString/*id*/, QString/*name*/> > OCR_LAN;
/* OCR 语言区域列表,nsocr有分区概念(两个区),Tesseract无(默认一个大区) */
typedef QList<QPair<QString /*area*/, OCR_LAN> > OCR_LANS;
public:
explicit GDPOcrText(QObject *parent = nullptr) : GDPObject(parent)
{}
virtual ~GDPOcrText()
{}
/*GDO_Type*/
int type() const { return GDOT_OcrText; }
/* 生成插件版本号 */
unsigned int version() const { return GDP_GENVER(1); }
/* 获取引擎能识别的所有语言 */
virtual OCR_LANS getAreaLans() const = 0;
/* 使能需要引擎识别的语言 */
virtual void enableLans(const QStringList &lans, const QString &area) = 0;
/* 设置识别语言库目录,如无则忽略 */
virtual void setDataPath(const QString &datadir) = 0;
virtual QString dataPath() const = 0;
/* 正在进行ocr识别吗? */
virtual bool isWorking() const = 0;
public slots:
/* 识别图像数据,缓存中为bmp图像格式数据 */
virtual void ocrMemory(const QByteArray &bmpdata, int dpi = 0) = 0; /* bmp data */
/* 识别图像数据,可以任何引擎能识别的图形文件 */
virtual void ocrFile(const QString &file, int dpi = 0) = 0;
/* 停止正在进行的ocr任务 */
virtual void stop() = 0;
signals:
/* 完成ocr识别后发射该信号,参数为ocr得到的文字 */
void textOcred(const QString &text);
};
当前实现的截图接口有:winmask、fromcliboard;winmask支持动态截图,截图时支持多屏间切换,在windows上表现完美,在linux的大部分桌面环境下表现与windows下一致(完美),在部分linxu桌面环境和macOS中不能使用;fromcliboard会调用预设或用户设定的命令区截图并把截取到的图形数据存在剪切板中,默认参数下,在Windows平台调用wingraber(winmask的静态截图实现),在linux中调用scrot和xclip实现,在macOS中调用screencapture实现。
class GDPGrabScreen : public GDPObject
{
Q_OBJECT
public:
explicit GDPGrabScreen(QObject *parent = nullptr) : GDPObject(parent)
{}
virtual ~GDPGrabScreen()
{}
int type() const { return GDOT_GrapScreen; }
unsigned int version() const { return GDP_GENVER(1); }
/* 设置截图命令, 非必须 */
virtual void setCmd(const QString &) {}
/* 正在截图过程中? */
virtual bool isBusy() const = 0;
public slots:
/* 开始截图 */
virtual bool start() = 0;
/* 停止截图 */
virtual void stop() = 0;
signals:
/* 完成截图, 返回截图(BMP)数据或图形文件以及图形文件DPI */
void grabed(const QByteArray &bmpData, int dpi = 0);
void grabedFile(const QString &fileName, int dpi = 0);
};