版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
《QtCreator快速入門》第2版第9章國際化、幫助系統(tǒng)和Qt插件(3課時)主要內(nèi)容9.1國際化(第1課時)9.2幫助系統(tǒng)(第2課時)9.3創(chuàng)建Qt插件(第3課時)9.4小結(jié)(第3課時)9.1國際化
國際化的英文表述為Internationalization,通常簡寫為I18N(首尾字母加中間的字符數(shù)),一個應(yīng)用程序的國際化就是使該應(yīng)用程序可以讓其他國家的用戶使用的過程。Qt支持現(xiàn)在使用的大多數(shù)語言,特別是:所有東亞語言(漢語、日語和朝鮮語)所有西方語言(使用拉丁字母)阿拉伯語西里爾語言(俄語和烏克蘭語等)希臘語希伯來語泰語和老撾語所有在Unicode5.1中不需要特殊處理的腳本在Qt中,所有的輸入部件和文本繪制方式對Qt所支持的所有語言都提供了內(nèi)置的支持。Qt內(nèi)置的字體引擎可以在同一時間正確而且精細(xì)的繪制不同的文本,這些文本可以包含來自眾多不同書寫系統(tǒng)的字符。使用QtLinguist翻譯應(yīng)用程序
在Qt中編寫代碼時要對需要顯示的字符串調(diào)用tr()函數(shù),完成代碼編寫后,對這個應(yīng)用程序的翻譯主要包含三步:1.運行l(wèi)update工具從C++源代碼中提取要翻譯的文本,這時會生成一個.ts文件,這個文件是XML格式的;2.在QtLinguist中打開.ts文件,并完成翻譯工作;3.運行l(wèi)release工具從.ts文件中獲得.qm文件,它是一個二進(jìn)制文件。這里的.ts文件是供翻譯人員使用的,而在程序運行時只需要使用.qm文件,這兩個文件都是與平臺無關(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);這里向界面上添加了三個標(biāo)簽,因為這三個標(biāo)簽中的內(nèi)容都是用戶可見的,所以需要調(diào)用tr()函數(shù)。
tr()函數(shù)tr()函數(shù)一共有三個參數(shù),它的原型如下:QString
QObject::tr(constchar*sourceText,
constchar*disambiguation=0,
int
n=-1)[static]
第一個參數(shù)sourceText就是要顯示的字符串,tr()函數(shù)會返回sourceText的譯文;第二個參數(shù)disambiguation是消除歧義字符串,比如這里的password,如果一個程序中需要輸入多個不同的密碼,那么在沒有上下文的情況下,就很難確定這個password到底指哪個密碼。這個參數(shù)一般使用類名或者部件名,比如這里使用了mainwindow,就說明這個password是在mainwindow上的;第三個參數(shù)n表明是否使用了復(fù)數(shù),因為英文單詞中復(fù)數(shù)一般要在單詞末尾加“s”,比如“1message”,復(fù)數(shù)時為“2messages”。遇到這種情況,就可以使用這個參數(shù),它可以根據(jù)數(shù)值來判斷是否需要添加“s”,例如:
intn=messages.count();
showMessage(tr("%n
message(s)saved","",n));第二步,更改項目文件
要在項目文件中指定生成的.ts文件,每一種翻譯語言對應(yīng)一個.ts文件。打開myI18N.pro文件,在最后面添加如下一行代碼:TRANSLATIONS=myI18N_zh_CN.ts
這表明后面生成的.ts文件的文件名為“myI18N_zh_CN.ts”,對于.ts的名稱可以隨意編寫,不過一般是以區(qū)域代碼來結(jié)尾,這樣可以更好的區(qū)分,例如這里使用了“zh_CN”來表示簡體中文。最后按下Ctrl+S保存該文件。第三步,使用lupdate生成.ts文件
先要使用lupdate工具來提取源代碼中的翻譯文本,生成.ts文件。在項目文件列表的“myI18N.pro”文件上點擊鼠標(biāo)右鍵,在彈出的菜單中選擇“在此打開命令行控制臺”,這時打開的命令行控制臺中會自動切換到了項目目錄下。 這時輸入下面一行代碼,并按下回車鍵:
lupdatemyI18N.pro該步也可以通過“工具→外部→Qt語言家→更新翻譯(lupdate)”菜單項來快速完成,注意在使用該菜單項之前先保存所有修改過的文件。第四步,使用QtLinguist完成翻譯
這一步一般是翻譯人員來做的,就是在QtLinguist中打開.ts文件,然后對字符串逐個進(jìn)行翻譯。在系統(tǒng)的開始菜單中啟動Linguist(也可以直接在命令行輸入“l(fā)inguist”啟動它;或者在Qt安裝目錄的tools目錄下找到并啟動它),然后點擊界面左上角的“open”圖標(biāo),在彈出的文件對話框中進(jìn)入項目目錄,打開“myI18N_zh_CN”文件。①菜單項和工具欄
在菜單欄中列出了QtLinguist的所有功能選項,而工具欄中列出了常用的一些功能,其中后面9個圖標(biāo)的功能為:在字符串列表中移動到前一個條目在字符串列表中移動到下一個條目在字符串列表中移動到前一個沒有完成翻譯的條目在字符串列表中移動到下一個沒有完成翻譯的條目標(biāo)記當(dāng)前條目為完成翻譯狀態(tài),然后移動到下一個沒有完成翻譯的條目打開或關(guān)閉加速鍵(accelerator)驗證(validation)。打開加速鍵驗證可以驗證加速鍵是否被翻譯,例如字符串中包含“&”符號,但是翻譯中沒有包含“&”符號,則驗證失敗。打開或關(guān)閉短語結(jié)束標(biāo)點符號驗證。打開短語標(biāo)點符號驗證可以驗證翻譯中是否使用了和字符串中相同的標(biāo)點來結(jié)尾。打開或關(guān)閉短語參考(phrasebook)驗證。打開短語參考驗證可以驗證翻譯是否和短語參考中的翻譯相同。在翻譯相似的程序時,若希望將常用的翻譯記錄下來,以便以后使用,就可以使用短語參考??梢酝ㄟ^“Phrases”→“NewPhraseBook”菜單來創(chuàng)建一個新的短語參考,然后再翻譯字符串時使用Ctrl+T將這個字符串及其翻譯放入短語參考中。打開或關(guān)閉占位符(placemarker)驗證。打開占位符驗證可以驗證翻譯中是否使用了和字符串中相同的占位符,例如%1,%2等。②上下文(Context)窗口
這里是一個上下文列表,羅列了要翻譯的字符串所在位置的上下文。其中的“Context”列使用字母表順序羅列了上下文的名字,它一般是QObject子類的名字;而“Item”列顯示的是字符串?dāng)?shù)目,例如0/8表明有8個要翻譯的字符串,已經(jīng)翻譯了0個。在每個上下文的最左端用圖標(biāo)表明了翻譯的狀態(tài),它們的含義是:上下文中的所有字符串都已經(jīng)被翻譯,而且所有的翻譯都通過了驗證測試(validationtest);上下文中的所有字符串或者都已經(jīng)被翻譯,或者都已經(jīng)標(biāo)記為已翻譯,但是至少有一個翻譯驗證測試失?。辉谏舷挛闹兄辽儆幸粋€字符串沒有被翻譯或者沒有被標(biāo)記為已翻譯;在該上下文中沒有再出現(xiàn)要翻譯的字符串,這通常意味著這個上下文已經(jīng)不在應(yīng)用程序中了。③字符串(String)窗口
這里羅列了在當(dāng)前上下文中找到的所有要翻譯的字符串。在這里選擇一個字符串,可以使這個字符串在翻譯區(qū)域進(jìn)行翻譯。在字符串左邊使用圖標(biāo)表明了字符串的狀態(tài),它們的含義是:源字符串已經(jīng)翻譯(可能為空),或者用戶已經(jīng)接受翻譯,而且翻譯通過了所有驗證測試;用戶已經(jīng)接受了翻譯,但是翻譯沒有通過所有的驗證測試;字符串已經(jīng)擁有了一個通過了所有驗證測試的非空翻譯,但是用戶還沒有接受該翻譯;字符串還沒有翻譯;字符串擁有一個翻譯,但是這個翻譯沒有通過所有的驗證測試;字符串已經(jīng)過時,它已經(jīng)不在該上下文中。④短語和表單(SourcesandForms)窗口:如果包含有要翻譯字符串的源文件在QtLinguist中可用,那么這個窗口會顯示當(dāng)前字符串在源文件中的上下文。⑤翻譯區(qū)域(TheTranslationArea):在字符串列表中選擇的字符串會出現(xiàn)在翻譯區(qū)域的最頂端的“SourceText”下面;如果在使用tr()函數(shù)時設(shè)置了第二個參數(shù)消除歧義注釋,那么這里還會在“Developercomments”下出現(xiàn)該注釋;后面的“translation”中可以輸入翻譯文本,如果文本中包含空格,會使用“.”顯示;最后面的“translatorcomments”中可以填寫翻譯注釋文本。⑥短語和猜測(PhrasesandGuesses):如果字符串列表中的當(dāng)前字符串出現(xiàn)在了已經(jīng)加載的短語參考中,那么當(dāng)前字符串和它在短語參考中的翻譯會被羅列在這個窗口。在這里可以雙擊翻譯文本,這樣翻譯文本就會復(fù)制到翻譯區(qū)域。⑦警告信息(Warnings)窗口:如果輸入的當(dāng)前字符串的翻譯沒有通過開啟的驗證測試,那么在這里會顯示失敗信息。翻譯程序翻譯區(qū)域可以看到現(xiàn)在已經(jīng)是要翻譯成中文“Chinesetranslation”,這是因為我們的.ts文件名中包含了中文的區(qū)域代碼。如果這里沒有正確顯示要翻譯成的語言,那么可以使用“Edit”→“TranslationFileSettings”菜單來更改。第五步,使用lrelease生成.qm文件
在命令行輸入如下一行代碼,并按下回車鍵:
lreleasemyI18N.pro
這樣就生成了.qm文件。也可以在QtLinguist中使用“文件→發(fā)布”和“文件→另外發(fā)布為”這兩個菜單項來生成當(dāng)前已打開的.ts文件對應(yīng)的.qm文件。該步還可以通過QtCreator的“工具→外部→Qt語言家→發(fā)布翻譯(lrelease)”菜單項來快速完成。第六步,使用.qm文件
在項目中添加代碼使用.qm文件來更改界面的語言。進(jìn)入main.cpp文件,然后在QApplication
a(argc,argv);代碼下添加如下代碼:
QTranslatortranslator;translator.load("../myI18N/myI18N_zh_CN.qm");
a.installTranslator(&translator);
這里先加載了.qm文件(使用了相對路徑),然后為QApplication對象安裝了翻譯。注意,這幾行代碼一定要放到創(chuàng)建部件的代碼之前,比如這里放到了“MainWindoww;”一行代碼之前,這樣才能對該部件進(jìn)行翻譯。程序翻譯中的相關(guān)問題
對所有用戶可見的文本使用QString對所有文字文本使用tr()函數(shù)對加速鍵的值使用QKeySequence()函數(shù),例如:exitAct=newQAction(tr("E&xit"),this);exitAct->setShortcuts(QKeySequence::Quit);對動態(tài)文本使用QString::arg()函數(shù)9.2幫助系統(tǒng)一個完善的應(yīng)用程序應(yīng)該提供盡可能豐富的幫助信息。在Qt中可以使用工具提示、狀態(tài)提示以及“What’sThis”等簡單的幫助提示,也可以使用QtAssistant來提供強(qiáng)大的在線幫助。簡單的幫助提示定制QtAssistant簡單的幫助提示
“What’sThis”幫助提示。在運行一個對話框窗口時,會看到在標(biāo)題欄中有一個“?”圖標(biāo),按下它就會進(jìn)入“What’sThis”模式,這時如果哪個部件設(shè)置了“What’sThis”幫助提示,那么當(dāng)鼠標(biāo)移動到它上面時就會彈出一個懸浮的文本框顯示相應(yīng)的幫助提示。設(shè)計模式實現(xiàn):在界面上點擊鼠標(biāo)右鍵,在彈出的菜單中選擇“改變‘這是什么’”菜單,這時便會出現(xiàn)“編輯這是什么”對話框,可以在這里輸入文本或者添加圖片來設(shè)置“What’sThis”幫助提示。代碼方式實現(xiàn):
QAction*action=QWhatsThis::createAction(this);
ui->mainToolBar->addAction(action);定制QtAssistant
為了將QtAssistant定制為自己的應(yīng)用程序的幫助瀏覽器,需要先進(jìn)行一些準(zhǔn)備工作,主要是生成一些文件,最后再在程序中啟動QtAssistant。主要的步驟如下:1.創(chuàng)建HTML格式的幫助文檔;2.創(chuàng)建Qt幫助項目(Qthelpproject).qhp文件,該文件是XML格式的,用來組織文檔,并且使它們可以在QtAssistant中使用;3.生成Qt壓縮幫助(Qtcompressedhelp).qch文件,該文件由.qhp文件生成,是二進(jìn)制文件;4.創(chuàng)建Qt幫助集合項目(Qthelpcollectionproject).qhcp文件,該文件是XML格式的,用來生成下面的.qhc文件;5.生成Qt幫助集合(Qthelpcollection).qhc文件,該文件是二進(jìn)制文件,可以使QtAssistant只顯示一個應(yīng)用程序的幫助文檔,也可以定制QtAssistant的外觀和一些功能;6.在程序中啟動QtAssistant。第一步,創(chuàng)建HTML格式的幫助文檔可以通過各種編輯器例如MicrosoftWord來編輯要使用的文檔,最后保存為HTML格式的文件。例如這里我們創(chuàng)建了5個HTML文件。然后在項目目錄中新建文件夾,命名為“documentation”,再將這些HTML文件放入其中。再在documentation文件夾中再新建一個“images”文件夾,往里面復(fù)制一個圖標(biāo)圖片,以后將作為QtAssistant的圖標(biāo),例如這里使用了yafeilinux.png圖片。第二步,創(chuàng)建.qhp文件
創(chuàng)建一個文本文件另存為“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,每一個.qhp文件的命名空間都必須是唯一的,命名空間會成為QtAssistant中的頁面的URL的第一部分,這個在后面的內(nèi)容中會涉及到;第四行指定了一個虛擬文件夾virtualFolder,這個文件夾并不需要創(chuàng)建,它只是用來區(qū)分文件的;再下面的過濾器部分filterSection標(biāo)簽包含了目錄表、索引和所有文檔文件的列表。過濾器部分可以設(shè)置過濾器屬性,這樣以后可以在QtAssistant中通過過濾器來設(shè)置文檔的顯示有否,不過,因為這里只有一個文檔,所以不需要QtAssistant的過濾器功能,這里也就不需要設(shè)置過濾器屬性;在目錄表toc(tableofcontents)標(biāo)簽中創(chuàng)建了所有HTML文件的目錄,指定了它們的標(biāo)題和對應(yīng)的路徑。然后是keywords標(biāo)簽,它指定了所有索引的關(guān)鍵字和對應(yīng)的文件,這些關(guān)鍵字會顯示在QtAssistant的索引頁面;在files標(biāo)簽中列出了所有的文件,也包含圖片文件。第三步,生成.qch文件
這里為了測試創(chuàng)建的文件是否可用,可以先生成.qch文件,然后在QtAssistant中注冊它。這樣運行QtAssistant就會看到添加的文檔了。不過,這一步不是必須的。打開命令行控制臺,然后使用cd命令跳轉(zhuǎn)到項目目錄的documentation目錄中,分別輸入下面的命令后按下回車:qhelpgenerator
myHelp.qhp–omyHelp.qchassistant–registermyHelp.qch第四步,創(chuàng)建.qhcp文件
要想使QtAssistant只顯示我們自己的幫助文檔的最簡單的方法就是生成幫助集合文件即.qhc文件,要生成.qhc文件,首先要創(chuàng)建.qhcp文件。在documentation文件夾中新建文本文檔,對其進(jìn)行編輯,最后另存為“myHelp.qhcp”,注意后綴為.qhcp。這里還要創(chuàng)建一個名為“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)簽中是對QtAssistant的外觀和功能的定制,其中設(shè)置了標(biāo)題、圖標(biāo)、緩存目錄、主頁、起始頁、About菜單文本、關(guān)于對話框的內(nèi)容和圖標(biāo)等,還關(guān)閉了一些沒有用的功能。
緩存目錄cacheDirectory,是進(jìn)行全文檢索等操作時緩存文件要存放的位置。
主頁homePage和起始頁startPage,這里使用了第二步中提到的QtAssistant的頁面的URL,這個URL由“qthelp://”開始,然后是在.qhp文件中設(shè)置的命名空間,然后是虛擬文件夾,最后是具體的HTML文件名。因為QtAssistant可以添加或者刪除文檔來為多個應(yīng)用程序提供幫助,但是這里只是為一個應(yīng)用程序提供幫助,并且不希望刪除我們的文檔,所以禁用了文檔管理器documentationmanager;因為這里的文檔集很小,而且只有一個過濾器部分,所以也關(guān)閉了地址欄addressbar和過濾器功能filterfunctionality。第五步,生成.qhc文件
在命令行輸入如下命令:qcollectiongenerator
myHelp.qhcp–omyHelp.qhc為了測試我們定制的QtAssistant,可以在輸入如下命令:assistant–collectionFile
myHelp.qhc這里在運行QtAssistant時指定了集合文件為我們自己的.qhc文件,所以運行后只會顯示我們自己的HTML文檔??梢钥吹?,現(xiàn)在QtAssistant的圖標(biāo)也更改了,打開“Help”菜單中的“關(guān)于該幫助”菜單,這里是前面添加的about.txt文件的內(nèi)容。第六步,在程序中啟動QtAssistant
自學(xué)內(nèi)容:如何在自己的程序中通過點擊按鈕來啟動自定義的幫助系統(tǒng)?9.3創(chuàng)建Qt插件Qt插件(QtPlugin)就是一個共享庫(dll文件),可以使用它來進(jìn)行功能的擴(kuò)展。Qt中提供了兩種API來創(chuàng)建插件:用來擴(kuò)展Qt本身的高級API,如自定義數(shù)據(jù)庫驅(qū)動、圖片格式、文本編碼和自定義風(fēng)格等;用來擴(kuò)展Qt應(yīng)用程序的低級API。如果要寫一個插件來擴(kuò)展Qt本身,那么可以子類化合適的插件基類,然后重寫一些函數(shù)并添加一個宏。在設(shè)計模式提升窗口部件
一般的,使用代碼生成的部件無法直接在設(shè)計器中使用,但是可以通過建立成設(shè)計器插件來實現(xiàn),不過,一個更簡單的方法是使用提升窗口部件的做法,這樣可以將設(shè)計器中的部件指定為我們自定義的類的實例。例如:先自定義一個類名為“MyButton”,基類為“QPushButton”的按鈕類。在設(shè)計模式中向界面上放入一個PushButton,并在pushButton上點擊鼠標(biāo)右鍵,在彈出的菜單中選擇“提升的窗口部件”。在彈出的對話框中將提升的類名稱改為“MyButton”,頭文件會自動生成為“mybutton.h”,這時按下右邊的添加按鈕,就會在提升的類列表中進(jìn)行顯示,按下“提升”按鈕退出對話框。創(chuàng)建應(yīng)用程序插件
當(dāng)要創(chuàng)建一個插件時,要先創(chuàng)建一個接口,接口就是一個類,它只包含純虛函數(shù)。插件類要繼承自該接口。插件類存儲在一個共享庫中,因此可以在應(yīng)用程序運行時進(jìn)行加載。創(chuàng)建一個插件包括以下幾步:定義一個插件類,它需要同時繼承自QObject類和該插件所提供的功能對應(yīng)的接口類;使用Q_INTERFACES()宏在Qt的元對象系統(tǒng)中注冊該接口;使用Q_EXPORT_PLUGIN2()宏導(dǎo)出該插件;使用合適的.pro文件構(gòu)建該插件。 使一個應(yīng)用程序可以通過插件進(jìn)行擴(kuò)展要進(jìn)行以下幾步:定義一組接口(只有純虛函數(shù)的抽象類);使用Q_DECLARE_INTERFACE()宏在Qt的元對象系統(tǒng)中注冊該接口;在應(yīng)用程序中使用QPluginLoader來加載插件;使用qobject_cast()來測試插件是否實現(xiàn)了給定的接口。示例通過創(chuàng)建一個過濾字符串中出現(xiàn)的第一個數(shù)字的插件來講解應(yīng)用程序的插件的創(chuàng)建過程。這里需要創(chuàng)建兩個項目,一個項目用來生成插件即dll文件;另一個項目是一個測試程序,用來使用插件。因為這兩個項目中有共用的文件,所以這里將它們放到一個目錄中。創(chuàng)建插件
第一步,創(chuàng)建插件類。新建空的Qt項目,項目名稱為“plugin”,在選擇路徑時指定到一個新建的“myPlugin”目錄中。建立好項目后向其中添加一個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
為了使這個類作為一個插件,它需要同時繼承自QObject和RegExpInterface。RegExpInterface是接口類,它用來指明插件要實現(xiàn)的功能,這個類在regexpinterface.h文件中定義,這個文件在后面的測試程序項目中。這里還需要使用Q_INTERFACES()宏將這個接口注冊到Qt的元對象系統(tǒng)中,告知Qt這個類實現(xiàn)了哪個接口。最后還聲明了一個regexp()函數(shù),它是在RegExpInterface中定義的一個純虛函數(shù)。這里通過重寫它來實現(xiàn)該插件具體的功能,就是將字符串中的第一個數(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為插件類名。第四步,更改項目文件。打開文件,將其內(nèi)容更改如下:TEMPLATE=libCONFIG+=pluginINCLUDEPATH+=../regexpwindowHEADERS=regexpplugin.hSOURCES=regexpplugin.cppTARGET=regexppluginDESTDIR=../plugins這里使用了TEMPLATE=lib表明該項目要構(gòu)建庫文件,而不是像以前那樣的可執(zhí)行文件;使用CONFIG+=plugin告知qmake要創(chuàng)建一個插件;因為項目中使用了regexpwindow目錄中的regexpinterface.h文件,所以這里將該目錄的路徑添加到了INCLUDEPATH中;TARGET指定了生產(chǎn)的dll文件的名字,它需要和上一步中的Q_EXPORT_PLUGIN2()指定的名字相同;最后使用DESTDIR指定了生成的dll文件所在的目錄。使用插件擴(kuò)展應(yīng)用程序第一步,新建QtGui應(yīng)用。項目名稱為“regexpwindow”,選擇路徑時仍選擇前面建立的myPlugin目錄?;愡x擇QWidget,類名保持“Widget”不變。建立完成后,向該項目中添加新文件,模板選擇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
在接口類中定義了插件要實現(xiàn)的函數(shù),比如這里定義了regexp()函數(shù),可以看到在前面的RegExpPlugin類中我們已經(jīng)實現(xiàn)了該函數(shù)。在這個類中只能包含純虛函數(shù)。最后使用Q_DECLARE_INTERFACE()宏在Qt元對象系統(tǒng)中注冊了該接口,其中第二個參數(shù)是一個字符串,用來確保這個接口與其他接口不會相同。第三步,加載插件。先點擊widget.ui文件進(jìn)入設(shè)計模式,設(shè)計的界面。將其中顯示“無”字的Label的objectName屬性更改為“l(fā)abelNum”。然后進(jìn)入widget.h文件,先添加頭文件#include"regexpinterface.h",然后在private部分定義一個接口對象指針,再聲明一個加載插件函數(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()來測試插件是否實現(xiàn)了RegExpInterface接口。最后到設(shè)計模式,轉(zhuǎn)到“過濾”按鈕的clicked()信號對應(yīng)的槽,更改如下:voidWidget::on_pushButton_clicked(){
QString
str=regexpInterface->regexp(ui->lineEdit->text());
ui->labelNum->setText(str);}
這里就是使用了regexpInterface接口的regexp()函數(shù)來獲取lineEdit部件中輸入的字符串中第一個出現(xiàn)的數(shù)字,然后在labelNum
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年四川省廣安市中考英語試題含解析
- 蘇教版六年級心理健康教育教案
- 全省小學(xué)數(shù)學(xué)教師賽課一等獎數(shù)學(xué)一年級上冊(人教2024年新編)《6和7的加、減法應(yīng)用》課件
- 全省小學(xué)數(shù)學(xué)教師賽課一等獎數(shù)學(xué)一年級上冊(人教2024年新編)《在校園里找一找》課件
- 2014-2018年全球PET瓶胚注塑機(jī)行業(yè)市場調(diào)查及前期規(guī)劃分析報告
- 2024至2030年中國手持式管道清理機(jī)數(shù)據(jù)監(jiān)測研究報告
- 2024至2030年中國彈性布數(shù)據(jù)監(jiān)測研究報告
- 2010-2012年環(huán)氧丙烷行業(yè)分析及企業(yè)競爭力分析報告
- 2024至2030年中國聲音傳感器數(shù)據(jù)監(jiān)測研究報告
- 2024至2030年中國印刷電路板型端子臺數(shù)據(jù)監(jiān)測研究報告
- 全面質(zhì)量管理的質(zhì)量保證與管理
- 深圳水療會所活動策劃
- 英式橄欖球和美式足球的比較分析
- 腫瘤病的早期診斷與治療
- 壓力容器使用單位的日常安全調(diào)度、周排查、月度調(diào)度文件pdf
- 英語高考復(fù)習(xí)應(yīng)用文寫作練習(xí)與講解1228(共三篇)講義
- 抖音培訓(xùn)教程方案提綱
- 《地球的公轉(zhuǎn)與四季變化》參考課件
- 海南省海口市重點中學(xué)2023-2024學(xué)年七年級上學(xué)期期中數(shù)學(xué)試卷(含答案)
- 2024銷售總監(jiān)聘用合同(19篇)
- 無人駕駛和大數(shù)據(jù)應(yīng)用
評論
0/150
提交評論