Qt Creator 插件开发(9):添加新的编辑器(续)

Core::IEditorFactory

Core::IEditorFactory提供用于创建Core::IEditor实例的函数。Core::IEditor则可以支持 mime-type 文件的编辑。这个接口在 src/plugins/coreplugin/editormanager/ieditorfactory.h 中声明:

#ifndef IEDITORFACTORY_H
#define IEDITORFACTORY_H

#include <coreplugin/ifilefactory.h>

namespace Core {

class IEditor;

class CORE_EXPORT IEditorFactory : public Core::IFileFactory
{
    Q_OBJECT
public:
    IEditorFactory(QObject *parent = 0) : IFileFactory(parent) {}
    virtual ~IEditorFactory() {}

    virtual IEditor *createEditor(QWidget *parent) = 0;
};

} // namespace Core

#endif // IEDITORFACTORY_H

IEditorFactory::mimeType()函数返回该编辑器所支持的 mime-type。IEditorFactory::createEditor()则用于创建该编辑器实例并将其返回。

Core::MimeDatabase

Core::MimeDatabase类用于保存 Qt Creator 所支持的所有的 mime-type;同时,这个类也可以判断给定文件的 mime-type。例如:

#include <coreplugin/mimedatabase.h>

Core::ICore* core = Core::ICore::instance();
Core::MimeDatabase* mdb = core->mimeDatabase();

Core::MimeType type1 = mdb->findByFile( QFileInfo("C:/Temp/sample.html") );
qDebug("File Type for sample.html = %s", qPrintable(type1.type()));

Core::MimeType type2 = mdb->findByFile( QFileInfo("C:/Temp/TextEdit/Main.cpp") );
qDebug("File Type for Main.cpp = %s", qPrintable(type2.type()));

Core::MimeType type3 = mdb->findByFile( QFileInfo("C:/Temp/TextEdit/TextEdit.pro") );
qDebug("File Type for TextEdit.pro = %s", qPrintable(type3.type()));

当我们运行上面代码时,我们会得到如下结果:

File Type for sample.html = text/plain
File Type for Main.cpp = text/x-c++src
File Type for TextEdit.pro = text/plain

Core::MimeDatabase利用文件后缀名、glob 模式以及“魔数”来判断给定的一个文件的 mime-type。不过此时,我们不去深究MimeDatabase是如何实现的,我们只需要知道可以获取文件的 mime-type 就好了。

正如前文所述,Core::IEditorFactory接口提供某一特定 mime-type 的编辑器(实现了Core::IEditor的类)的实例。那么,下面我们来解释一下,对于给定的文件名,Qt Creator 如何找到合适的Core::IEditorFactory的:

  1. 用户使用“文件->打开”命令选择一个文件;
  2. Qt Creator 使用Core::MimeDatabase识别选定文件的 mime-type;
  3. Qt Creator 遍历所有的Core::IEditorFactory实现,找到支持第 2 步所识别出的 mime-type 的 editor-factory;
  4. Qt Creator 请求该 editor factory 创建一个编辑器实例(Core::IEditor实现);
  5. Core::IEditor::widget()返回的组件显示在 Qt Creator 的主窗口;
  6. 调用Core::IEditor::open()函数,打开第 1 步选择的文件。

添加新的 mime-type

如果我们要添加新文件类型的编辑器,就需要向Core::MimeDatabase注册 mime-type。有很多种机制都可以实现注册新的 mime-type,这里我们使用最简单的方式:利用 XML 文件。

假设我们要注册 text/html mime-type,并且关联 *.html 文件名。我们需要创建一个 XML 文件,然后命名为 text-html-mimetype.xml。

<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
    <mime-type type="text/html">
        <sub-class-of type="text/plain"/>
        <comment>HTML File</comment>
        <glob pattern="*.html"/>
    </mime-type>
</mime-info>

我们利用这个 XML 文件,通过Core::MimeDatabase::addMimeTypes()函数注册新的 mime-type。所需代码示例如下:

Core::ICore* core = Core::ICore::instance();
Core::MimeDatabase* mdb = core->mimeDatabase();
QString errMsg;
bool success = mdb->addMimeTypes("text-html-mimetype.xml", errMsg);

一旦注册成功,Qt Creator 就会将所有 *.html 文件名映射成 text/plain mime-type。

One Response

  1. 王显灿 2016年8月31日

Leave a Reply