日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QtCreator插件开发(四)——QtCreator编辑器

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_H

IDocument與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_H

Core::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_H

IEditorFactory::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/plain

Core::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编辑器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。