Qt Creator快速入門 第9章 國際化、幫助系統(tǒng)和Qt插件_第1頁
Qt Creator快速入門 第9章 國際化、幫助系統(tǒng)和Qt插件_第2頁
Qt Creator快速入門 第9章 國際化、幫助系統(tǒng)和Qt插件_第3頁
Qt Creator快速入門 第9章 國際化、幫助系統(tǒng)和Qt插件_第4頁
Qt Creator快速入門 第9章 國際化、幫助系統(tǒng)和Qt插件_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

《QtCreator快速入門》第2版第9章國際化、幫助系統(tǒng)和Qt插件(3課時(shí))主要內(nèi)容9.1國際化(第1課時(shí))9.2幫助系統(tǒng)(第2課時(shí))9.3創(chuàng)建Qt插件(第3課時(shí))9.4小結(jié)(第3課時(shí))9.1國際化

國際化的英文表述為Internationalization,通常簡寫為I18N(首尾字母加中間的字符數(shù)),一個(gè)應(yīng)用程序的國際化就是使該應(yīng)用程序可以讓其他國家的用戶使用的過程。Qt支持現(xiàn)在使用的大多數(shù)語言,特別是:所有東亞語言(漢語、日語和朝鮮語)所有西方語言(使用拉丁字母)阿拉伯語西里爾語言(俄語和烏克蘭語等)希臘語希伯來語泰語和老撾語所有在Unicode5.1中不需要特殊處理的腳本在Qt中,所有的輸入部件和文本繪制方式對(duì)Qt所支持的所有語言都提供了內(nèi)置的支持。Qt內(nèi)置的字體引擎可以在同一時(shí)間正確而且精細(xì)的繪制不同的文本,這些文本可以包含來自眾多不同書寫系統(tǒng)的字符。使用QtLinguist翻譯應(yīng)用程序

在Qt中編寫代碼時(shí)要對(duì)需要顯示的字符串調(diào)用tr()函數(shù),完成代碼編寫后,對(duì)這個(gè)應(yīng)用程序的翻譯主要包含三步:1.運(yùn)行l(wèi)update工具從C++源代碼中提取要翻譯的文本,這時(shí)會(huì)生成一個(gè).ts文件,這個(gè)文件是XML格式的;2.在QtLinguist中打開.ts文件,并完成翻譯工作;3.運(yùn)行l(wèi)release工具從.ts文件中獲得.qm文件,它是一個(gè)二進(jìn)制文件。這里的.ts文件是供翻譯人員使用的,而在程序運(yùn)行時(shí)只需要使用.qm文件,這兩個(gè)文件都是與平臺(tái)無關(guān)的。第一步:編寫源碼QLabel*label=newQLabel(this);label->setText(tr("helloQt!"));label->move(100,50);QLabel*label2=newQLabel(this);label2->setText(tr("password","mainwindow"));label2->move(100,80);QLabel*label3=newQLabel(this);intid=123;QStringname="yafei";label3->setText(tr("IDis%1,Nameis%2").arg(id).arg(name));label3->resize(150,12);label3->move(100,120);這里向界面上添加了三個(gè)標(biāo)簽,因?yàn)檫@三個(gè)標(biāo)簽中的內(nèi)容都是用戶可見的,所以需要調(diào)用tr()函數(shù)。

tr()函數(shù)tr()函數(shù)一共有三個(gè)參數(shù),它的原型如下:QString

QObject::tr(constchar*sourceText,

constchar*disambiguation=0,

int

n=-1)[static]

第一個(gè)參數(shù)sourceText就是要顯示的字符串,tr()函數(shù)會(huì)返回sourceText的譯文;第二個(gè)參數(shù)disambiguation是消除歧義字符串,比如這里的password,如果一個(gè)程序中需要輸入多個(gè)不同的密碼,那么在沒有上下文的情況下,就很難確定這個(gè)password到底指哪個(gè)密碼。這個(gè)參數(shù)一般使用類名或者部件名,比如這里使用了mainwindow,就說明這個(gè)password是在mainwindow上的;第三個(gè)參數(shù)n表明是否使用了復(fù)數(shù),因?yàn)橛⑽膯卧~中復(fù)數(shù)一般要在單詞末尾加“s”,比如“1message”,復(fù)數(shù)時(shí)為“2messages”。遇到這種情況,就可以使用這個(gè)參數(shù),它可以根據(jù)數(shù)值來判斷是否需要添加“s”,例如:

intn=messages.count();

showMessage(tr("%n

message(s)saved","",n));第二步,更改項(xiàng)目文件

要在項(xiàng)目文件中指定生成的.ts文件,每一種翻譯語言對(duì)應(yīng)一個(gè).ts文件。打開myI18N.pro文件,在最后面添加如下一行代碼:TRANSLATIONS=myI18N_zh_CN.ts

這表明后面生成的.ts文件的文件名為“myI18N_zh_CN.ts”,對(duì)于.ts的名稱可以隨意編寫,不過一般是以區(qū)域代碼來結(jié)尾,這樣可以更好的區(qū)分,例如這里使用了“zh_CN”來表示簡體中文。最后按下Ctrl+S保存該文件。第三步,使用lupdate生成.ts文件

先要使用lupdate工具來提取源代碼中的翻譯文本,生成.ts文件。在項(xiàng)目文件列表的“myI18N.pro”文件上點(diǎn)擊鼠標(biāo)右鍵,在彈出的菜單中選擇“在此打開命令行控制臺(tái)”,這時(shí)打開的命令行控制臺(tái)中會(huì)自動(dòng)切換到了項(xiàng)目目錄下。 這時(shí)輸入下面一行代碼,并按下回車鍵:

lupdatemyI18N.pro該步也可以通過“工具→外部→Qt語言家→更新翻譯(lupdate)”菜單項(xiàng)來快速完成,注意在使用該菜單項(xiàng)之前先保存所有修改過的文件。第四步,使用QtLinguist完成翻譯

這一步一般是翻譯人員來做的,就是在QtLinguist中打開.ts文件,然后對(duì)字符串逐個(gè)進(jìn)行翻譯。在系統(tǒng)的開始菜單中啟動(dòng)Linguist(也可以直接在命令行輸入“l(fā)inguist”啟動(dòng)它;或者在Qt安裝目錄的tools目錄下找到并啟動(dòng)它),然后點(diǎn)擊界面左上角的“open”圖標(biāo),在彈出的文件對(duì)話框中進(jìn)入項(xiàng)目目錄,打開“myI18N_zh_CN”文件。①菜單項(xiàng)和工具欄

在菜單欄中列出了QtLinguist的所有功能選項(xiàng),而工具欄中列出了常用的一些功能,其中后面9個(gè)圖標(biāo)的功能為:在字符串列表中移動(dòng)到前一個(gè)條目在字符串列表中移動(dòng)到下一個(gè)條目在字符串列表中移動(dòng)到前一個(gè)沒有完成翻譯的條目在字符串列表中移動(dòng)到下一個(gè)沒有完成翻譯的條目標(biāo)記當(dāng)前條目為完成翻譯狀態(tài),然后移動(dòng)到下一個(gè)沒有完成翻譯的條目打開或關(guān)閉加速鍵(accelerator)驗(yàn)證(validation)。打開加速鍵驗(yàn)證可以驗(yàn)證加速鍵是否被翻譯,例如字符串中包含“&”符號(hào),但是翻譯中沒有包含“&”符號(hào),則驗(yàn)證失敗。打開或關(guān)閉短語結(jié)束標(biāo)點(diǎn)符號(hào)驗(yàn)證。打開短語標(biāo)點(diǎn)符號(hào)驗(yàn)證可以驗(yàn)證翻譯中是否使用了和字符串中相同的標(biāo)點(diǎn)來結(jié)尾。打開或關(guān)閉短語參考(phrasebook)驗(yàn)證。打開短語參考驗(yàn)證可以驗(yàn)證翻譯是否和短語參考中的翻譯相同。在翻譯相似的程序時(shí),若希望將常用的翻譯記錄下來,以便以后使用,就可以使用短語參考??梢酝ㄟ^“Phrases”→“NewPhraseBook”菜單來創(chuàng)建一個(gè)新的短語參考,然后再翻譯字符串時(shí)使用Ctrl+T將這個(gè)字符串及其翻譯放入短語參考中。打開或關(guān)閉占位符(placemarker)驗(yàn)證。打開占位符驗(yàn)證可以驗(yàn)證翻譯中是否使用了和字符串中相同的占位符,例如%1,%2等。②上下文(Context)窗口

這里是一個(gè)上下文列表,羅列了要翻譯的字符串所在位置的上下文。其中的“Context”列使用字母表順序羅列了上下文的名字,它一般是QObject子類的名字;而“Item”列顯示的是字符串?dāng)?shù)目,例如0/8表明有8個(gè)要翻譯的字符串,已經(jīng)翻譯了0個(gè)。在每個(gè)上下文的最左端用圖標(biāo)表明了翻譯的狀態(tài),它們的含義是:上下文中的所有字符串都已經(jīng)被翻譯,而且所有的翻譯都通過了驗(yàn)證測(cè)試(validationtest);上下文中的所有字符串或者都已經(jīng)被翻譯,或者都已經(jīng)標(biāo)記為已翻譯,但是至少有一個(gè)翻譯驗(yàn)證測(cè)試失?。辉谏舷挛闹兄辽儆幸粋€(gè)字符串沒有被翻譯或者沒有被標(biāo)記為已翻譯;在該上下文中沒有再出現(xiàn)要翻譯的字符串,這通常意味著這個(gè)上下文已經(jīng)不在應(yīng)用程序中了。③字符串(String)窗口

這里羅列了在當(dāng)前上下文中找到的所有要翻譯的字符串。在這里選擇一個(gè)字符串,可以使這個(gè)字符串在翻譯區(qū)域進(jìn)行翻譯。在字符串左邊使用圖標(biāo)表明了字符串的狀態(tài),它們的含義是:源字符串已經(jīng)翻譯(可能為空),或者用戶已經(jīng)接受翻譯,而且翻譯通過了所有驗(yàn)證測(cè)試;用戶已經(jīng)接受了翻譯,但是翻譯沒有通過所有的驗(yàn)證測(cè)試;字符串已經(jīng)擁有了一個(gè)通過了所有驗(yàn)證測(cè)試的非空翻譯,但是用戶還沒有接受該翻譯;字符串還沒有翻譯;字符串擁有一個(gè)翻譯,但是這個(gè)翻譯沒有通過所有的驗(yàn)證測(cè)試;字符串已經(jīng)過時(shí),它已經(jīng)不在該上下文中。④短語和表單(SourcesandForms)窗口:如果包含有要翻譯字符串的源文件在QtLinguist中可用,那么這個(gè)窗口會(huì)顯示當(dāng)前字符串在源文件中的上下文。⑤翻譯區(qū)域(TheTranslationArea):在字符串列表中選擇的字符串會(huì)出現(xiàn)在翻譯區(qū)域的最頂端的“SourceText”下面;如果在使用tr()函數(shù)時(shí)設(shè)置了第二個(gè)參數(shù)消除歧義注釋,那么這里還會(huì)在“Developercomments”下出現(xiàn)該注釋;后面的“translation”中可以輸入翻譯文本,如果文本中包含空格,會(huì)使用“.”顯示;最后面的“translatorcomments”中可以填寫翻譯注釋文本。⑥短語和猜測(cè)(PhrasesandGuesses):如果字符串列表中的當(dāng)前字符串出現(xiàn)在了已經(jīng)加載的短語參考中,那么當(dāng)前字符串和它在短語參考中的翻譯會(huì)被羅列在這個(gè)窗口。在這里可以雙擊翻譯文本,這樣翻譯文本就會(huì)復(fù)制到翻譯區(qū)域。⑦警告信息(Warnings)窗口:如果輸入的當(dāng)前字符串的翻譯沒有通過開啟的驗(yàn)證測(cè)試,那么在這里會(huì)顯示失敗信息。翻譯程序翻譯區(qū)域可以看到現(xiàn)在已經(jīng)是要翻譯成中文“Chinesetranslation”,這是因?yàn)槲覀兊?ts文件名中包含了中文的區(qū)域代碼。如果這里沒有正確顯示要翻譯成的語言,那么可以使用“Edit”→“TranslationFileSettings”菜單來更改。第五步,使用lrelease生成.qm文件

在命令行輸入如下一行代碼,并按下回車鍵:

lreleasemyI18N.pro

這樣就生成了.qm文件。也可以在QtLinguist中使用“文件→發(fā)布”和“文件→另外發(fā)布為”這兩個(gè)菜單項(xiàng)來生成當(dāng)前已打開的.ts文件對(duì)應(yīng)的.qm文件。該步還可以通過QtCreator的“工具→外部→Qt語言家→發(fā)布翻譯(lrelease)”菜單項(xiàng)來快速完成。第六步,使用.qm文件

在項(xiàng)目中添加代碼使用.qm文件來更改界面的語言。進(jìn)入main.cpp文件,然后在QApplication

a(argc,argv);代碼下添加如下代碼:

QTranslatortranslator;translator.load("../myI18N/myI18N_zh_CN.qm");

a.installTranslator(&translator);

這里先加載了.qm文件(使用了相對(duì)路徑),然后為QApplication對(duì)象安裝了翻譯。注意,這幾行代碼一定要放到創(chuàng)建部件的代碼之前,比如這里放到了“MainWindoww;”一行代碼之前,這樣才能對(duì)該部件進(jìn)行翻譯。程序翻譯中的相關(guān)問題

對(duì)所有用戶可見的文本使用QString對(duì)所有文字文本使用tr()函數(shù)對(duì)加速鍵的值使用QKeySequence()函數(shù),例如:exitAct=newQAction(tr("E&xit"),this);exitAct->setShortcuts(QKeySequence::Quit);對(duì)動(dòng)態(tài)文本使用QString::arg()函數(shù)9.2幫助系統(tǒng)一個(gè)完善的應(yīng)用程序應(yīng)該提供盡可能豐富的幫助信息。在Qt中可以使用工具提示、狀態(tài)提示以及“What’sThis”等簡單的幫助提示,也可以使用QtAssistant來提供強(qiáng)大的在線幫助。簡單的幫助提示定制QtAssistant簡單的幫助提示

“What’sThis”幫助提示。在運(yùn)行一個(gè)對(duì)話框窗口時(shí),會(huì)看到在標(biāo)題欄中有一個(gè)“?”圖標(biāo),按下它就會(huì)進(jìn)入“What’sThis”模式,這時(shí)如果哪個(gè)部件設(shè)置了“What’sThis”幫助提示,那么當(dāng)鼠標(biāo)移動(dòng)到它上面時(shí)就會(huì)彈出一個(gè)懸浮的文本框顯示相應(yīng)的幫助提示。設(shè)計(jì)模式實(shí)現(xiàn):在界面上點(diǎn)擊鼠標(biāo)右鍵,在彈出的菜單中選擇“改變‘這是什么’”菜單,這時(shí)便會(huì)出現(xiàn)“編輯這是什么”對(duì)話框,可以在這里輸入文本或者添加圖片來設(shè)置“What’sThis”幫助提示。代碼方式實(shí)現(xiàn):

QAction*action=QWhatsThis::createAction(this);

ui->mainToolBar->addAction(action);定制QtAssistant

為了將QtAssistant定制為自己的應(yīng)用程序的幫助瀏覽器,需要先進(jìn)行一些準(zhǔn)備工作,主要是生成一些文件,最后再在程序中啟動(dòng)QtAssistant。主要的步驟如下:1.創(chuàng)建HTML格式的幫助文檔;2.創(chuàng)建Qt幫助項(xiàng)目(Qthelpproject).qhp文件,該文件是XML格式的,用來組織文檔,并且使它們可以在QtAssistant中使用;3.生成Qt壓縮幫助(Qtcompressedhelp).qch文件,該文件由.qhp文件生成,是二進(jìn)制文件;4.創(chuàng)建Qt幫助集合項(xiàng)目(Qthelpcollectionproject).qhcp文件,該文件是XML格式的,用來生成下面的.qhc文件;5.生成Qt幫助集合(Qthelpcollection).qhc文件,該文件是二進(jìn)制文件,可以使QtAssistant只顯示一個(gè)應(yīng)用程序的幫助文檔,也可以定制QtAssistant的外觀和一些功能;6.在程序中啟動(dòng)QtAssistant。第一步,創(chuàng)建HTML格式的幫助文檔可以通過各種編輯器例如MicrosoftWord來編輯要使用的文檔,最后保存為HTML格式的文件。例如這里我們創(chuàng)建了5個(gè)HTML文件。然后在項(xiàng)目目錄中新建文件夾,命名為“documentation”,再將這些HTML文件放入其中。再在documentation文件夾中再新建一個(gè)“images”文件夾,往里面復(fù)制一個(gè)圖標(biāo)圖片,以后將作為QtAssistant的圖標(biāo),例如這里使用了yafeilinux.png圖片。第二步,創(chuàng)建.qhp文件

創(chuàng)建一個(gè)文本文件另存為“myHelp.qhp”,.qhp文件是XML格式的。<?xmlversion="1.0"encoding="GB2312"?><QtHelpProjectversion="1.0"><namespace>yafeilinux.myHelp</namespace><virtualFolder>doc</virtualFolder><filterSection><toc><sectiontitle="我的幫助"ref="./index.html"><sectiontitle="關(guān)于我們"ref="./aboutUs.html"><sectiontitle="關(guān)于yafeilinux"ref="./about_yafeilinux.html"></section><sectiontitle="關(guān)于QtCreator系列教程"ref="./about_QtCreator.html"></section></section><sectiontitle="加入我們"ref="./joinUs.html"></section></section></toc><keywords><keywordname="關(guān)于"ref="./aboutUs.html"/><keywordname="yafeilinux"ref="./about_yafeilinux.html"/><keywordname="QtCreator"ref="./about_QtCreator.html"/></keywords><files><file>about_QtCreator.html</file><file>aboutUs.html</file><file>about_yafeilinux.html</file><file>index.html</file><file>joinUs.html</file><file>images/*.png</file></files></filterSection></QtHelpProject>在第一行是XML序言,這里指定了編碼encoding為GB2312,這樣就可以使用中文了,如果只想使用英文,那么編碼一般是UTF-8;第二行指定了QtHelpProject版本為1.0;第三行指定了命名空間namespace,每一個(gè).qhp文件的命名空間都必須是唯一的,命名空間會(huì)成為QtAssistant中的頁面的URL的第一部分,這個(gè)在后面的內(nèi)容中會(huì)涉及到;第四行指定了一個(gè)虛擬文件夾virtualFolder,這個(gè)文件夾并不需要?jiǎng)?chuàng)建,它只是用來區(qū)分文件的;再下面的過濾器部分filterSection標(biāo)簽包含了目錄表、索引和所有文檔文件的列表。過濾器部分可以設(shè)置過濾器屬性,這樣以后可以在QtAssistant中通過過濾器來設(shè)置文檔的顯示有否,不過,因?yàn)檫@里只有一個(gè)文檔,所以不需要QtAssistant的過濾器功能,這里也就不需要設(shè)置過濾器屬性;在目錄表toc(tableofcontents)標(biāo)簽中創(chuàng)建了所有HTML文件的目錄,指定了它們的標(biāo)題和對(duì)應(yīng)的路徑。然后是keywords標(biāo)簽,它指定了所有索引的關(guān)鍵字和對(duì)應(yīng)的文件,這些關(guān)鍵字會(huì)顯示在QtAssistant的索引頁面;在files標(biāo)簽中列出了所有的文件,也包含圖片文件。第三步,生成.qch文件

這里為了測(cè)試創(chuàng)建的文件是否可用,可以先生成.qch文件,然后在QtAssistant中注冊(cè)它。這樣運(yùn)行QtAssistant就會(huì)看到添加的文檔了。不過,這一步不是必須的。打開命令行控制臺(tái),然后使用cd命令跳轉(zhuǎn)到項(xiàng)目目錄的documentation目錄中,分別輸入下面的命令后按下回車:qhelpgenerator

myHelp.qhp–omyHelp.qchassistant–registermyHelp.qch第四步,創(chuàng)建.qhcp文件

要想使QtAssistant只顯示我們自己的幫助文檔的最簡單的方法就是生成幫助集合文件即.qhc文件,要生成.qhc文件,首先要?jiǎng)?chuàng)建.qhcp文件。在documentation文件夾中新建文本文檔,對(duì)其進(jìn)行編輯,最后另存為“myHelp.qhcp”,注意后綴為.qhcp。這里還要?jiǎng)?chuàng)建一個(gè)名為“about.txt”的文本文件,在其中輸入一些該幫助的說明信息,作為QtAssistant的About菜單的顯示內(nèi)容。<?xmlversion="1.0"encoding="GB2312"?><QHelpCollectionProjectversion="1.0"><assistant><title>我的幫助系統(tǒng)</title><applicationIcon>images/yafeilinux.png</applicationIcon><cacheDirectory>cache/myHelp</cacheDirectory><homePage>qthelp://yafeilinux.myHelp/doc/index.html</homePage><startPage>qthelp://yafeilinux.myHelp/doc/index.html</startPage><aboutMenuText><text>關(guān)于該幫助</text></aboutMenuText><aboutDialog><file>./about.txt</file><icon>images/yafeilinux.png</icon></aboutDialog><enableDocumentationManager>false</enableDocumentationManager><enableAddressBar>false</enableAddressBar><enableFilterFunctionality>false</enableFilterFunctionality></assistant><docFiles><generate><file><input>myHelp.qhp</input><output>myHelp.qch</output></file></generate><register><file>myHelp.qch</file></register></docFiles></QHelpCollectionProject>在assistant標(biāo)簽中是對(duì)QtAssistant的外觀和功能的定制,其中設(shè)置了標(biāo)題、圖標(biāo)、緩存目錄、主頁、起始頁、About菜單文本、關(guān)于對(duì)話框的內(nèi)容和圖標(biāo)等,還關(guān)閉了一些沒有用的功能。

緩存目錄cacheDirectory,是進(jìn)行全文檢索等操作時(shí)緩存文件要存放的位置。

主頁homePage和起始頁startPage,這里使用了第二步中提到的QtAssistant的頁面的URL,這個(gè)URL由“qthelp://”開始,然后是在.qhp文件中設(shè)置的命名空間,然后是虛擬文件夾,最后是具體的HTML文件名。因?yàn)镼tAssistant可以添加或者刪除文檔來為多個(gè)應(yīng)用程序提供幫助,但是這里只是為一個(gè)應(yīng)用程序提供幫助,并且不希望刪除我們的文檔,所以禁用了文檔管理器documentationmanager;因?yàn)檫@里的文檔集很小,而且只有一個(gè)過濾器部分,所以也關(guān)閉了地址欄addressbar和過濾器功能filterfunctionality。第五步,生成.qhc文件

在命令行輸入如下命令:qcollectiongenerator

myHelp.qhcp–omyHelp.qhc為了測(cè)試我們定制的QtAssistant,可以在輸入如下命令:assistant–collectionFile

myHelp.qhc這里在運(yùn)行QtAssistant時(shí)指定了集合文件為我們自己的.qhc文件,所以運(yùn)行后只會(huì)顯示我們自己的HTML文檔??梢钥吹?,現(xiàn)在QtAssistant的圖標(biāo)也更改了,打開“Help”菜單中的“關(guān)于該幫助”菜單,這里是前面添加的about.txt文件的內(nèi)容。第六步,在程序中啟動(dòng)QtAssistant

自學(xué)內(nèi)容:如何在自己的程序中通過點(diǎn)擊按鈕來啟動(dòng)自定義的幫助系統(tǒng)?9.3創(chuàng)建Qt插件Qt插件(QtPlugin)就是一個(gè)共享庫(dll文件),可以使用它來進(jìn)行功能的擴(kuò)展。Qt中提供了兩種API來創(chuàng)建插件:用來擴(kuò)展Qt本身的高級(jí)API,如自定義數(shù)據(jù)庫驅(qū)動(dòng)、圖片格式、文本編碼和自定義風(fēng)格等;用來擴(kuò)展Qt應(yīng)用程序的低級(jí)API。如果要寫一個(gè)插件來擴(kuò)展Qt本身,那么可以子類化合適的插件基類,然后重寫一些函數(shù)并添加一個(gè)宏。在設(shè)計(jì)模式提升窗口部件

一般的,使用代碼生成的部件無法直接在設(shè)計(jì)器中使用,但是可以通過建立成設(shè)計(jì)器插件來實(shí)現(xiàn),不過,一個(gè)更簡單的方法是使用提升窗口部件的做法,這樣可以將設(shè)計(jì)器中的部件指定為我們自定義的類的實(shí)例。例如:先自定義一個(gè)類名為“MyButton”,基類為“QPushButton”的按鈕類。在設(shè)計(jì)模式中向界面上放入一個(gè)PushButton,并在pushButton上點(diǎn)擊鼠標(biāo)右鍵,在彈出的菜單中選擇“提升的窗口部件”。在彈出的對(duì)話框中將提升的類名稱改為“MyButton”,頭文件會(huì)自動(dòng)生成為“mybutton.h”,這時(shí)按下右邊的添加按鈕,就會(huì)在提升的類列表中進(jìn)行顯示,按下“提升”按鈕退出對(duì)話框。創(chuàng)建應(yīng)用程序插件

當(dāng)要?jiǎng)?chuàng)建一個(gè)插件時(shí),要先創(chuàng)建一個(gè)接口,接口就是一個(gè)類,它只包含純虛函數(shù)。插件類要繼承自該接口。插件類存儲(chǔ)在一個(gè)共享庫中,因此可以在應(yīng)用程序運(yùn)行時(shí)進(jìn)行加載。創(chuàng)建一個(gè)插件包括以下幾步:定義一個(gè)插件類,它需要同時(shí)繼承自QObject類和該插件所提供的功能對(duì)應(yīng)的接口類;使用Q_INTERFACES()宏在Qt的元對(duì)象系統(tǒng)中注冊(cè)該接口;使用Q_EXPORT_PLUGIN2()宏導(dǎo)出該插件;使用合適的.pro文件構(gòu)建該插件。 使一個(gè)應(yīng)用程序可以通過插件進(jìn)行擴(kuò)展要進(jìn)行以下幾步:定義一組接口(只有純虛函數(shù)的抽象類);使用Q_DECLARE_INTERFACE()宏在Qt的元對(duì)象系統(tǒng)中注冊(cè)該接口;在應(yīng)用程序中使用QPluginLoader來加載插件;使用qobject_cast()來測(cè)試插件是否實(shí)現(xiàn)了給定的接口。示例通過創(chuàng)建一個(gè)過濾字符串中出現(xiàn)的第一個(gè)數(shù)字的插件來講解應(yīng)用程序的插件的創(chuàng)建過程。這里需要?jiǎng)?chuàng)建兩個(gè)項(xiàng)目,一個(gè)項(xiàng)目用來生成插件即dll文件;另一個(gè)項(xiàng)目是一個(gè)測(cè)試程序,用來使用插件。因?yàn)檫@兩個(gè)項(xiàng)目中有共用的文件,所以這里將它們放到一個(gè)目錄中。創(chuàng)建插件

第一步,創(chuàng)建插件類。新建空的Qt項(xiàng)目,項(xiàng)目名稱為“plugin”,在選擇路徑時(shí)指定到一個(gè)新建的“myPlugin”目錄中。建立好項(xiàng)目后向其中添加一個(gè)C++類,類名為“RegExpPlugin”,基類保持為空,類型信息選擇“無”。

第二步,定義插件類。將regexpplugin.h文件中的內(nèi)容更改如下:#ifndefREGEXPPLUGIN_H#defineREGEXPPLUGIN_H#include<QObject>#include"regexpinterface.h"classRegExpPlugin:publicQObject,RegExpInterface{Q_OBJECT

Q_INTERFACES(RegExpInterface)

public:

QString

regexp(const

QString&message);};#endif

為了使這個(gè)類作為一個(gè)插件,它需要同時(shí)繼承自QObject和RegExpInterface。RegExpInterface是接口類,它用來指明插件要實(shí)現(xiàn)的功能,這個(gè)類在regexpinterface.h文件中定義,這個(gè)文件在后面的測(cè)試程序項(xiàng)目中。這里還需要使用Q_INTERFACES()宏將這個(gè)接口注冊(cè)到Qt的元對(duì)象系統(tǒng)中,告知Qt這個(gè)類實(shí)現(xiàn)了哪個(gè)接口。最后還聲明了一個(gè)regexp()函數(shù),它是在RegExpInterface中定義的一個(gè)純虛函數(shù)。這里通過重寫它來實(shí)現(xiàn)該插件具體的功能,就是將字符串中的第一個(gè)數(shù)字提取出來并返回。

第三步,導(dǎo)出插件。將regexpplugin.cpp文件中的內(nèi)容更改如下:#include“regexpplugin.h”#include<QRegExp>#include<QtPlugin>QString

RegExpPlugin::regexp(const

QString&message){

QRegExp

rx("\\d+");

rx.indexIn(message);

QString

str=rx.cap(0);returnstr;}Q_EXPORT_PLUGIN2(regexpplugin,RegExpPlugin); 這里最后使用了Q_EXPORT_PLUGIN2()導(dǎo)出了該插件,其中regexpplugin為插件名,RegExpPlugin為插件類名。第四步,更改項(xiàng)目文件。打開文件,將其內(nèi)容更改如下:TEMPLATE=libCONFIG+=pluginINCLUDEPATH+=../regexpwindowHEADERS=regexpplugin.hSOURCES=regexpplugin.cppTARGET=regexppluginDESTDIR=../plugins這里使用了TEMPLATE=lib表明該項(xiàng)目要構(gòu)建庫文件,而不是像以前那樣的可執(zhí)行文件;使用CONFIG+=plugin告知qmake要?jiǎng)?chuàng)建一個(gè)插件;因?yàn)轫?xiàng)目中使用了regexpwindow目錄中的regexpinterface.h文件,所以這里將該目錄的路徑添加到了INCLUDEPATH中;TARGET指定了生產(chǎn)的dll文件的名字,它需要和上一步中的Q_EXPORT_PLUGIN2()指定的名字相同;最后使用DESTDIR指定了生成的dll文件所在的目錄。使用插件擴(kuò)展應(yīng)用程序第一步,新建QtGui應(yīng)用。項(xiàng)目名稱為“regexpwindow”,選擇路徑時(shí)仍選擇前面建立的myPlugin目錄?;愡x擇QWidget,類名保持“Widget”不變。建立完成后,向該項(xiàng)目中添加新文件,模板選擇C++頭文件,名稱為“regexpinterface.h”。

第二步,定義接口。將regexpinterface.h文件的內(nèi)容更改如下:#ifndefREGEXPINTERFACE_H#defineREGEXPINTERFACE_H#include<QString>classRegExpInterface{public:virtual~RegExpInterface(){}virtualQString

regexp(const

QString&message)=0;};Q_DECLARE_INTERFACE(RegExpInterface,"yafeilinux.RegExpInterface/1.0");#endif

在接口類中定義了插件要實(shí)現(xiàn)的函數(shù),比如這里定義了regexp()函數(shù),可以看到在前面的RegExpPlugin類中我們已經(jīng)實(shí)現(xiàn)了該函數(shù)。在這個(gè)類中只能包含純虛函數(shù)。最后使用Q_DECLARE_INTERFACE()宏在Qt元對(duì)象系統(tǒng)中注冊(cè)了該接口,其中第二個(gè)參數(shù)是一個(gè)字符串,用來確保這個(gè)接口與其他接口不會(huì)相同。第三步,加載插件。先點(diǎn)擊widget.ui文件進(jìn)入設(shè)計(jì)模式,設(shè)計(jì)的界面。將其中顯示“無”字的Label的objectName屬性更改為“l(fā)abelNum”。然后進(jìn)入widget.h文件,先添加頭文件#include"regexpinterface.h",然后在private部分定義一個(gè)接口對(duì)象指針,再聲明一個(gè)加載插件函數(shù):RegExpInterface*regexpInterface;bool

loadPlugin();現(xiàn)在到widget.cpp文件中先添加頭文件包含:#include<QPluginLoader>#include<QMessageBox>#include<QDir>

然后在構(gòu)造函數(shù)中調(diào)用加載插件函數(shù),如果加載失敗則進(jìn)行警告:if(!loadPlugin()){//如果無法加載插件

QMessageBox::information(this,"Error","Couldnotloadtheplugin");

ui->lineEdit->setEnabled(false);

ui->pushButton->setEnabled(false);}下面是加載插件函數(shù)的定義:bool

Widget::loadPlugin(){QDir

pluginsDir("../plugins");//遍歷插件目錄

foreach(QString

fileName,pluginsDir.entryList(QDir::Files)){

QPluginLoader

pluginLoader(pluginsDir.absoluteFilePath(fileName));

QObject*plugin=pluginLoader.instance();if(plugin){

regexpInterface=qobject_cast<RegExpInterface*>(plugin);if(regexpInterface)returntrue;}}returnfalse;}

這里使用QDir類指定到存放dll文件的plugins目錄,然后遍歷該目錄,使用QPluginLoader類來加載插件,并使用qobject_cast()來測(cè)試插件是否實(shí)現(xiàn)了RegExpInterface接口。最后到設(shè)計(jì)模式,轉(zhuǎn)到“過濾”按鈕的clicked()信號(hào)對(duì)應(yīng)的槽,更改如下:voidWidget::on_pushButton_clicked(){

QString

str=regexpInterface->regexp(ui->lineEdit->text());

ui->labelNum->setText(str);}

這里就是使用了regexpInterface接口的regexp()函數(shù)來獲取lineEdit部件中輸入的字符串中第一個(gè)出現(xiàn)的數(shù)字,然后在labelNum

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論