QtCreator插件开发(四)——QtCreator编辑器
一、HTML編輯器核心類和接口簡介
1、HTML編輯器簡介
QtCreator最基本的功能是一個文本編輯器。QtCreator還提供了編輯UI文件、QRC文件、PRO/PRI文件以及EXE/DLL/SO文件的功能。
HTML編輯器插件將使QtCreator能夠從本地文件系統中加載HTML文件,并且能夠查看和編輯。
為了支持新的編輯器類型,需要:
A、實現一個插件類(實現Core::IPlugin接口),暴露出一個“編輯器工廠”。
B、實現“編輯器工廠”,即Core::IEditorFactory接口。Core::IEditorFactory接口提供了幫助創建特定格式編輯器對象的函數。
C、實現編輯器,即Core::IEditor接口。Core::IEditor接口提供了用于輔助編輯一種文件格式(例如 HTML、PDF 等)的函數。編輯器必須提供訪問它所要顯示或者編輯的文件的函數。
D、實現接口Core::IDocument。Core::IDocument接口用于輔助從磁盤進行數據加載或保存。
2、Core::IDocument接口
Core::IDocument接口將文件操作從用戶界面抽象出來,提供用于加載和保存文件以及獲取文件名的虛函數。IDocument可以將文件看做具有mime-tyle、“modified”和“read-only”等標記位的對象。IDocument接口在src/plugins/coreplugin/idocument.h中聲明:
#ifndef?IDOCUMENT_H #define?IDOCUMENT_H#include?"core_global.h" #include?<QObject>namespace?Core?{class?MimeType; class?InfoBar;class?CORE_EXPORT?IDocument?:?public?QObject {Q_OBJECT public://?This?enum?must?match?the?indexes?of?the?reloadBehavior?widget//?in?generalsettings.uienum?ReloadSetting?{AlwaysAsk?=?0,ReloadUnmodified?=?1,IgnoreAll?=?2};enum?Utf8BomSetting?{AlwaysAdd?=?0,OnlyKeep?=?1,AlwaysDelete?=?2};enum?ChangeTrigger?{TriggerInternal,TriggerExternal};enum?ChangeType?{TypeContents,TypePermissions,TypeRemoved};enum?ReloadBehavior?{BehaviorAsk,BehaviorSilent};enum?ReloadFlag?{FlagReload,FlagIgnore};IDocument(QObject?*parent?=?0);virtual?~IDocument();virtual?bool?save(QString?*errorString,?const?QString?&fileName?=?QString(),?bool?autoSave?=?false)?=?0;virtual?QString?fileName()?const?=?0;virtual?bool?isFileReadOnly()?const;virtual?QString?defaultPath()?const?=?0;virtual?QString?suggestedFileName()?const?=?0;virtual?QString?mimeType()?const?=?0;virtual?bool?shouldAutoSave()?const;virtual?bool?isModified()?const?=?0;virtual?bool?isSaveAsAllowed()?const?=?0;virtual?ReloadBehavior?reloadBehavior(ChangeTrigger?state,?ChangeType?type)?const;virtual?bool?reload(QString?*errorString,?ReloadFlag?flag,?ChangeType?type)?=?0;virtual?void?rename(const?QString?&newName)?=?0;virtual?void?checkPermissions();bool?autoSave(QString?*errorString,?const?QString?&fileName);void?setRestoredFrom(const?QString?&name);void?removeAutoSaveFile();bool?hasWriteWarning()?const?{?return?m_hasWriteWarning;?}void?setWriteWarning(bool?has)?{?m_hasWriteWarning?=?has;?}InfoBar?*infoBar(); signals:void?changed();void?aboutToReload();void?reloadFinished(bool?success);void?fileNameChanged(const?QString?&oldName,?const?QString?&newName); private:QString?m_autoSaveName;InfoBar?*m_infoBar;bool?m_hasWriteWarning;bool?m_restored; };}?//?namespace?Core#endif?//?IDOCUMENT_HIDocument與QFile的區別如下:
IDocument關心的是以文件名為參數,將一個文件的內容加載進一個編輯器editor的行為,而QFile僅僅是將文件內容加載到一個QByteArray對象;IDocument需要在用戶在編輯器中修改了文件內容的時候發出modified()信號,此時的文件修改并沒有寫入磁盤;而QFile只有在文件內容寫入磁盤時才會發出bytesWritten()信號;IDocument需要處理一個在磁盤被修改的文件如何重新加載到編輯器中,而QFile不需要處理這種問題。
3、Core::IEditor接口
Core::IEditor接口的實現提供了編輯不同類型文件的編輯器。IEditor接口位于src/plugins/coreplugin/editormanager/ieditor.h中。
#ifndef?IEDITOR_H #define?IEDITOR_H#include?<coreplugin/core_global.h> #include?<coreplugin/icontext.h>#include?<QMetaType>namespace?Core?{class?IDocument;class?CORE_EXPORT?IEditor?:?public?IContext {Q_OBJECT public:IEditor(QObject?*parent?=?0)?:?IContext(parent)?{}virtual?~IEditor()?{}virtual?bool?createNew(const?QString?&contents?=?QString())?=?0;virtual?bool?open(QString?*errorString,?const?QString?&fileName,?const?QString?&realFileName)?=?0;virtual?IDocument?*document()?=?0;virtual?Core::Id?id()?const?=?0;virtual?QString?displayName()?const?=?0;virtual?void?setDisplayName(const?QString?&title)?=?0;virtual?bool?duplicateSupported()?const?{?return?false;?}virtual?IEditor?*duplicate(QWidget?*?/*parent*/)?{?return?0;?}virtual?QByteArray?saveState()?const?{?return?QByteArray();?}virtual?bool?restoreState(const?QByteArray?&/*state*/)?{?return?true;?}virtual?int?currentLine()?const?{?return?0;?}virtual?int?currentColumn()?const?{?return?0;?}virtual?void?gotoLine(int?line,?int?column?=?0)?{?Q_UNUSED(line)?Q_UNUSED(column)?}virtual?bool?isTemporary()?const?=?0;virtual?QWidget?*toolBar()?=?0;virtual?bool?isDesignModePreferred()?const?{?return?false;?} signals:void?changed(); };}?//?namespace?CoreQ_DECLARE_METATYPE(Core::IEditor*)#endif?//?IEDITOR_HCore::IEditor主要提供以下功能:
A、一個編輯器組件(由Core::IEditor::widget()函數返回)。QtCreator使用這個組件顯示編輯文件的內容;
B、Core::IDocument接口實現的document對象的獲取(由Core::IEditor::document()函數返回),QtCreator使用document對象觸發文件從磁盤加載以及保存到磁盤的操作;
C、一個自定義的工具條 toolbar,QtCreator會在該編輯器可用時自動加載該工具條;
D、在文件中光標的當前位置(Core::IEditor::currentLine()和Core::IEditor::currentColumn()函數)
E、需要顯示在“打開文件”列表的名字。
?4、Core::IEditorFactory
Core::IEditorFactory提供了用于創建可支持MIME類型的Core::IEditor實例的函數。Core::IEditorFactory接口在src/plugins/coreplugin/editormanager/ieditorfactory.h中聲明。
#ifndef?IEDITORFACTORY_H #define?IEDITORFACTORY_H#include?<coreplugin/idocumentfactory.h>namespace?Core?{class?IEditor;class?CORE_EXPORT?IEditorFactory?:?public?Core::IDocumentFactory {Q_OBJECT public:IEditorFactory(QObject?*parent?=?0)?:?IDocumentFactory(parent)?{}virtual?IEditor?*createEditor(QWidget?*parent)?=?0;virtual?IDocument?*open(const?QString?&); };}?//?namespace?Core#endif?//?IEDITORFACTORY_HIEditorFactory::createEditor()則用于創建一個具體的編輯器實例并將其返回。
5、Core::MimeDatabase
Core::MimeDatabase類用于保存QtCreator所支持的所有的 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("./sample.html")?); qDebug("File?Type?for?sample.html?=?%s",?qPrintable(type1.type())); Core::MimeType?type2?=?mdb->findByFile(?QFileInfo("./Main.cpp")?); qDebug("File?Type?for?Main.cpp?=?%s",?qPrintable(type2.type())); Core::MimeType?type3?=?mdb->findByFile(?QFileInfo("./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/plainCore::MimeDatabase使用文件名后綴、glob模式(正則表達式)、魔數匹配器計算所給文件的MIME類型。
Core::IEditorFactory接口提供一個指定MIME類型的由Core::IEditor實現的編輯器。以下的過程有助于我們理解QtCreator如何根據給定的文件名選擇合適的Core::IEditorFactory。
A、用戶點擊File->Open,選擇要打開的文件
B、QtCreator使用Core::MimeDatabase獲取選中文件的MIME類型
C、QtCreator遍歷運行所有實現的Core::IEditorFactory,選擇支持相應MIME類型的編輯器工廠。
D、QtCreator請求選中的編輯器工廠創建一個編輯器。
E、BaseTextEditor::editorWidget()函數返回組件,在主窗口顯示
F、Core::IEditor::open()函數打開選擇的文件
6、增加一個MIME類型
如果想要支持一個新的編輯器類型,需要將新編輯器支持的MIME類型注冊到Core::MimeDatabase。注冊新的MIME類型到Core::MimeDatabase有多種方法。最簡單的方法是從一個XML文件注冊新的MIME 類型。
假定注冊一個MIME類型為text/html,并將其關聯*.html文件名,可以創建一個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描述的MIME類型可以使用Core::MimeDatabase::addMimeTypes()函數。
Core::ICore*?core?=?Core::ICore::instance(); Core::MimeDatabase*?mdb?=?core->mimeDatabase(); QString?errMsg; bool?success?=?mdb->addMimeTypes("text-html-mimetype.xml",?errMsg);注冊成功后,QtCreator會映射文件名為*.html的文件到text/plain類型。
二、HTMLEditor編輯器的實現
1、HTML編輯器設計
HTML編輯器作為QtCreator的插件存在,支持HTML文件的查看和編輯。用戶可以使用標準的File -> Open菜單打開HTML文件,使用File -> Save菜單保存HTML文件的變化。界面如下:
?HTML編輯器在底部有Preview和Source兩個按鈕,點擊Source按鈕時,HTML編輯器在QPlainTextEdit組件中顯示HTML文件代碼。在Source選項頁時,用戶可以修改HTML文件內容,并且在切換到Preview選項頁時能夠預覽HTML的效果。
HTML編輯器的類設計如下:
HTMLEditorWidget:繼承自QTabWidget,提供有兩個選項卡的tab組件,用于預覽HTML效果和顯示HTML代碼。
HTMLDocument:實現了Core::IDocument接口,用于在HTMLEditorWidget組件顯示的文件。
HTMLEditor:實現了Core::IEditor接口,用于管理HTMLEditorWidget組件
HTMLEditorFactory:實現了Core::IEditorFactory接口,用于創建一個text/html類型的IEditor實例。
HTMLEditorPlugin:實現了Core::IPlugin接口,用于在QtCreator中回調HTMLEditorWidget、HTMLDocument、HTMLEditor、HTMLEditorFactory。
總結
以上是生活随笔為你收集整理的QtCreator插件开发(四)——QtCreator编辑器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python面板数据分析代码_面板数据分
- 下一篇: shiro权限管理基本原理和实现的整理