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
的:
- 用户使用“文件->打开”命令选择一个文件;
- Qt Creator 使用
Core::MimeDatabase
识别选定文件的 mime-type; - Qt Creator 遍历所有的
Core::IEditorFactory
实现,找到支持第 2 步所识别出的 mime-type 的 editor-factory; - Qt Creator 请求该 editor factory 创建一个编辑器实例(
Core::IEditor
实现); - 由
Core::IEditor::widget()
返回的组件显示在 Qt Creator 的主窗口; - 调用
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。
1 个评论
程老师,我下载的QT Creator版本是4.0.3,在coreplugin中mimedatabase.h这个文件。在新版本的QT Creator中是怎么注册mime-type的啊。