Qt學(xué)習(xí)筆記,還在更新中……_第1頁(yè)
Qt學(xué)習(xí)筆記,還在更新中……_第2頁(yè)
Qt學(xué)習(xí)筆記,還在更新中……_第3頁(yè)
Qt學(xué)習(xí)筆記,還在更新中……_第4頁(yè)
Qt學(xué)習(xí)筆記,還在更新中……_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、qt的學(xué)習(xí)之旅qt自定義的對(duì)話框qmessagebox類qmessagebox類提供了一個(gè)有一條簡(jiǎn)短消息、一個(gè)圖標(biāo)和一些按鈕的對(duì)話框,可以向用戶產(chǎn)生消息,警告,確認(rèn)等對(duì)話框,只需要簡(jiǎn)單的應(yīng)用就可以產(chǎn)生各種的樣式,他提供了以下幾種模式。qmessagebox:about,僅僅帶有標(biāo)題和簡(jiǎn)單文本的消息框,一般用于顯示幫助提示信息.qmessagebox:information,具有主題和提示文本的提示消息框,可以根據(jù)情況定制按鈕的個(gè)數(shù),以及用法qmessagebox:question,具有標(biāo)題和文本信息的咨詢消息框,可以根據(jù)情況定制按鈕的個(gè)數(shù),以及用法qmessagebox:warning,具有標(biāo)

2、題和文本信息的警告消息框,可以根據(jù)情況定制按鈕的個(gè)數(shù),以及用法qmessagebox:critical,具有標(biāo)題和文本信息的致命錯(cuò)誤消息框,可以定制按鈕的個(gè)數(shù),以及用法qmessagebox:aboutqt,顯示廣域qt的消息框,包括qt版本以及trolltech公司的產(chǎn)品信息等.代碼非常的簡(jiǎn)單,另外還有一些成員函數(shù)可以來(lái)添加按鈕,設(shè)置圖標(biāo)等等,下面看一下qmessagebox各種樣式的簡(jiǎn)單例子。1.qmessagebox:aboutqmessagebox:about(null, about site, );/自動(dòng)攜帶一個(gè)”ok”按鈕?;蛘呷缦滦问絨messagebox:about(this,

3、 about, this is a ligin dialog example.);2. qmessagebox:informationqmessagebox:information(this, suggest, the program installation is wrong, qmessagebox:retry| qmessagebox:ignore|qmessage:discard);/提示程序安裝錯(cuò)誤,有“重試”、“忽略”、“放棄”三個(gè)按鈕提供選擇。3.qmessagebox:questionqmessagebox:question(this, exit, installation i

4、s wrong,are you exiting?,qmessagebox:yes|qmessagebox:no);/詢問(wèn)是否退出安裝程序4. qmessagebox:waringqmessagebox:waring(this,”waring”,”system is wrong”,qmessagebox:help|qmessagebox:ignore);/警告系統(tǒng)出錯(cuò),是尋求幫助,還是忽略錯(cuò)誤。5. qmessagebox:criticalqmessagebox:critical(this,”fatal error”,”system has fatal error!”qmessagebox:he

5、lp|qmessagebox:save,qmessagebox:close);/提示系統(tǒng)出現(xiàn)嚴(yán)重的錯(cuò)誤,是尋求幫助、保存,還是關(guān)閉。6.qmessagebox:aboutqtqmessagebox:aboutqt(this,”about qt”);qmessagebox:standardbuttons的類型常量指descriptionqmessagebox:ok0x00000400定義ok按鈕qmessagebox:open0x00002000定義open打開按鈕qmessagebox:save0x00000800定義save保存按鈕.qmessagebox:cancel0x00400000定

6、義cancel取消按鈕qmessagebox:close0x00200000定義close關(guān)閉按鈕.qmessagebox:discard0x00800000定義放棄或者不保存按鈕.qmessagebox:apply0x02000000定義應(yīng)用按鈕.qmessagebox:reset0x04000000定義重置按鈕.qmessagebox:restoredefaults0x08000000定義默認(rèn)保存按鈕.qmessagebox:help0x01000000定義幫助按鈕.qmessagebox:saveall0x00001000定義保存所有按鈕qmessagebox:yes0x00004000

7、定義yes按鈕.qmessagebox:yestoall0x00008000對(duì)于所有都yes的按鈕.qmessagebox:no0x00010000定義no按鈕qmessagebox:notoall0x00020000定義不是對(duì)所有的按鈕.qmessagebox:abort0x00040000定義中途終止按鈕.qmessagebox:retry0x00080000定義重試按鈕.qmessagebox:ignore0x00100000定義忽略按鈕.qmessagebox:nobutton0x00000000定義成無(wú)效按鈕對(duì)qmessagebox返回值進(jìn)行處理qmessagebox提供的后四種消息

8、框都具有返回值,用戶可以根據(jù)需求進(jìn)行下一步處理。 qmessagebox box;box.setwindowtitle(tr(warning);box.seticon(qmessagebox:warning);box.settext(tr(installation is wrong,are you exited?);box.setstandardbuttons(qmessagebox:yes|qmessagebox:no);switch(box.exec()case qmessagebox:yes:qmessagebox:warning(this,yes,success,qmessagebox

9、:yes); break;case qmessagebox:no:qmessagebox:warning(this,no,failure,qmessagebox:no);break;default:qmessagebox:warning(this,retry,retry,qmessagebox:retry);usrlineedit-setfocus();qt中亂碼的處理1.在有關(guān)漢字的處理中用到tr()函數(shù);2.同時(shí),在主函數(shù)中添加一個(gè)句子:qtextcodec:setcodecfortr(qtextcodec:codecforname(utf-8);(函數(shù)1)tr()是將字符串打包,經(jīng)過(guò)函數(shù)

10、1將其解碼并生成utf-8格式。大多數(shù)編譯器生成的代碼是utf-8格式的;但在編輯的時(shí)候可能用的是gb2312、gb18030等,所以在中間有個(gè)翻譯轉(zhuǎn)換的過(guò)程。其實(shí),還有一個(gè)問(wèn)題:在編寫代碼的時(shí)候,采用的編碼格式會(huì)影響到代碼在編輯器的顯示。比如,在windows下編寫完成了代碼,在linux的kdevelop中打開,可能所有的漢字都是亂碼。這是由于編輯器所支持的代碼格式不一樣。需要將其統(tǒng)一為現(xiàn)在編輯的代碼格式最笨的方法就是手工的將其再改寫一遍,但是有些麻煩。此問(wèn)題即使在主程序中用了一段代碼創(chuàng)建一個(gè)翻譯器,也只能保證在運(yùn)行之后顯示的不是亂碼,而在編寫時(shí)顯示的還是亂碼,影響對(duì)代碼的進(jìn)一步修改。針對(duì)

11、這個(gè)問(wèn)題,我們只需要知道所打開的文件是采用什么編碼格式的,然后在kdevelop中設(shè)置,選擇settings-configure editor-open/save選項(xiàng),在打開的界面中將encoding設(shè)置和該文件相同的編碼格式,然后,在主程序中添加:qtextcodec:setcodecfortr(qtextcodec:codecforname(該文件的編碼格式);即可。tr()的作用編碼方式 國(guó)際通用的unicode包括了所有的字符的編碼,然后在不同的國(guó)家或是地區(qū)或是組織,有自己的編碼,比如中國(guó)大陸有g(shù)b2312、臺(tái)灣有big5、日本 有euc-jp等等,表示阿拉伯文的是iso 8895-6

12、等等。而因?yàn)閡nicode是國(guó)際通用的編碼,幾乎包括所有的字符,qt使用unicode編碼,所以在qt中需要將unicode編碼和其 他編碼之前的轉(zhuǎn)換。 qt中的國(guó)際化tr() qt中的tr是將指定的字符串翻譯成本地語(yǔ)言。它是怎么實(shí)現(xiàn)的呢?經(jīng)過(guò)閱讀代碼,其過(guò)程如下(下面是qt2的過(guò)程,qt4大致相同): 1)tr函數(shù)會(huì)直接調(diào)用到qapplication:translate()函數(shù) 2)在qapplication:translate()函數(shù)中,會(huì)找到根據(jù)所有的qtranslater對(duì)象來(lái)翻譯指定的源字符串。在qt中,使用 lupdate和lrealse工具生成的翻譯文件*.qm,每一個(gè)qm文件對(duì)

13、于一個(gè)qtranslater對(duì)象。所以這一步是在所有的*.qm文件中查 找。如果找到,則直接返回翻譯的文本 3)當(dāng)在*.qm中找不到該字符串的時(shí)候,再根據(jù)當(dāng)前的文本編碼模式將文本轉(zhuǎn)換為unicode編碼返回(當(dāng)前的文本編碼模式是qtextcodec的子類的對(duì)象) 4)如果在第3步中不能轉(zhuǎn)換為有效的unicode值,那么直接返回在原來(lái)的字符串。說(shuō)明:在qt2中,每一個(gè)application只有一個(gè)默認(rèn)的文本編碼方式,而在qt4中,有本地的編碼方式,有翻譯的編碼方式。他們的作用是不同的。至于,利用一段長(zhǎng)代碼給應(yīng)用程序創(chuàng)建翻譯器(translator),暫時(shí)沒(méi)有研究,本人認(rèn)為還未用的上。呵呵qt的內(nèi)

14、建(built-in)對(duì)話框?yàn)榱吮阌诔绦騿T進(jìn)行某些特定功能對(duì)話框的編程,qt提供了一套標(biāo)準(zhǔn)的對(duì)話框。這些對(duì)話框都提供了一些便于使用的靜態(tài)函數(shù)。qcolordialog:能夠允許用戶選擇顏色。qerrormessag:顯示錯(cuò)誤信息。qfiledialog:能夠允許用戶選擇一個(gè)或者多個(gè)文件以及目錄。qfontdialog:允許用戶選擇/設(shè)置字體。qinputdialog:允許用戶進(jìn)行簡(jiǎn)單的輸入。qpagesetupdialog:配置與頁(yè)相關(guān)的打印機(jī)選項(xiàng)。qprogressdialog:提示一個(gè)長(zhǎng)時(shí)間操作的工作進(jìn)程,以提示用戶該操作是否已經(jīng)停滯。qprintdialog:配置打印機(jī)。下邊舉個(gè)例子進(jìn)行

15、說(shuō)明/header file:builtindlg.h#ifndef _builtindlg_h_#define _builtindlg_h_#include /define three classesclass qtextedit;class qpushbutton;class cbuiltindlg : public qdialog q_objectpublic:cbuiltindlg(qwidget* = 0);virtual cbuiltindlg() private:qtextedit*displaytextedit;qpushbutton*colorpushbtn;qpushbut

16、ton*errorpushbtn;qpushbutton*filepushbtn;qpushbutton*fontpushbtn;qpushbutton*inputpushbtn;qpushbutton*pagepushbtn;qpushbutton*progresspushbtn;qpushbutton*printpushbtn;private slots:void dopushbtn();#endif/realize function:builtindlg.cpp/ chapter2/builtin/src/builtindlg.cpp.#include #include builtind

17、lg.hcbuiltindlg:cbuiltindlg(qwidget* parent) :qdialog(parent)displaytextedit = new qtextedit(tr(qt的標(biāo)準(zhǔn)通用對(duì)話框);qgridlayout* gridlayout = new qgridlayout;colorpushbtn = new qpushbutton(tr(顏色設(shè)置對(duì)話框);errorpushbtn = new qpushbutton(tr(錯(cuò)誤設(shè)置對(duì)話框);filepushbtn = new qpushbutton(tr(文件對(duì)話框);fontpushbtn = new qpushb

18、utton(tr(字體對(duì)話框);inputpushbtn = new qpushbutton(tr(輸入對(duì)話框);pagepushbtn = new qpushbutton(tr(頁(yè)面設(shè)置對(duì)話框);progresspushbtn = new qpushbutton(tr(進(jìn)度對(duì)話框);printpushbtn= new qpushbutton(tr(打印對(duì)話框);gridlayout-addwidget(colorpushbtn, 0, 0, 1, 1);/這四個(gè)數(shù)字分別代表:gridlayout-addwidget(errorpushbtn, 0, 1, 1, 1);/行、列、該對(duì)象框所占用

19、的行、列。gridlayout-addwidget(filepushbtn, 0, 2, 1, 1);gridlayout-addwidget(fontpushbtn, 1, 0, 1, 1);gridlayout-addwidget(inputpushbtn, 1, 1, 1, 1);gridlayout-addwidget(pagepushbtn, 1, 2, 1, 1);gridlayout-addwidget(progresspushbtn, 2, 0, 1, 1);gridlayout-addwidget(printpushbtn, 2, 1, 1, 1);gridlayout-ad

20、dwidget(displaytextedit, 3, 0, 3, 3);setlayout(gridlayout); connect(colorpushbtn, signal(clicked(), this, slot(dopushbtn(); connect(errorpushbtn, signal(clicked(), this, slot(dopushbtn();connect(filepushbtn, signal(clicked(), this, slot(dopushbtn(); connect(fontpushbtn, signal(clicked(), this, slot(

21、dopushbtn();connect(inputpushbtn, signal(clicked(), this, slot(dopushbtn(); connect(pagepushbtn, signal(clicked(), this, slot(dopushbtn();connect(progresspushbtn, signal(clicked(), this, slot(dopushbtn();connect(printpushbtn, signal(clicked(), this, slot(dopushbtn();setwindowtitle(tr(內(nèi)建對(duì)話框);resize(4

22、00, 300);void cbuiltindlg:dopushbtn()/獲取發(fā)送信號(hào)的qpushbutton對(duì)象的指針;函數(shù)qobject:sender()返回發(fā)送信號(hào)的對(duì)象的指針,返回類型為qobject* object)。模板函數(shù):t qobject_cast(qobject* object)完成轉(zhuǎn)換,將類型的對(duì)象指針轉(zhuǎn)換為類型的對(duì)象的指針。 qpushbutton* btn = qobject_cast(sender();if(btn = colorpushbtn)/ 顏色消息框qpalette palette = displaytextedit-palette();/獲取文本編輯器

23、的調(diào)色板/調(diào)用qcolordialog:getcolor()函數(shù)來(lái)創(chuàng)建并顯示一個(gè)模態(tài)的顏色對(duì)話框,并返回用戶選擇的顏色對(duì)象的常量引用(對(duì)臨時(shí)對(duì)象的引用是無(wú)效的,必須使用常量引用)賦給color變量。const qcolor& color= qcolordialog:getcolor(palette.color(qpalette:base), this);if(color.isvalid()palette.setcolor(qpalette:base, color);displaytextedit-setpalette(palette); else if(btn = errorpushbtn)/

24、 錯(cuò)誤消息框.qerrormessage box(this);box.setwindowtitle(tr(錯(cuò)誤消息框);box.showmessage(tr(錯(cuò)誤消息框?qū)嵗齲x。);box.showmessage(tr(錯(cuò)誤消息框?qū)嵗齲x。);box.showmessage(tr(錯(cuò)誤消息框?qū)嵗齲x。);box.showmessage(tr(錯(cuò)誤消息框?qū)嵗齳y。);box.showmessage(tr(錯(cuò)誤消息框?qū)嵗齴z。);box.exec();else if(btn = filepushbtn)/ 文件對(duì)話框.qstring filename = qfiledialog:getopenfi

25、lename(this, tr(打開文件),/home/rock, tr(任何文件(*.*);文本文件(*.txt);xml文件(*.xml);/指定了多個(gè)過(guò)濾器,之間用;間隔。displaytextedit-settext(filename);else if(btn = fontpushbtn)/ 字體對(duì)話框.bool ok;/第一個(gè)參數(shù)ok是一個(gè)輸出參數(shù),用于標(biāo)識(shí)用戶的選擇狀態(tài),如果用戶單擊“確定”按鈕,該字體對(duì)話框?qū)?huì)/設(shè)置ok變量為true;而如果單擊取消按鈕,ok將會(huì)被設(shè)置為false;const qfont& font = qfontdialog:getfont(&ok,displ

26、aytextedit-font(),this,tr(字體對(duì)話框);if(ok)/ 如果確定設(shè)置字體.displaytextedit-setfont(font);else if(btn = inputpushbtn)/ 輸入對(duì)話框.bool ok; qstring text = qinputdialog:gettext(this,tr(輸入對(duì)話框), tr(輸入文本),qlineedit:normal, qdir:home().dirname(),&ok);/默認(rèn)返回home路徑的名/字 if (ok & !text.isempty() displaytextedit-settext(text)

27、;else if(btn = pagepushbtn)/ 頁(yè)面設(shè)置對(duì)話框.qprinter printer;qpagesetupdialog dlg(&printer, this);dlg.setwindowtitle(tr(頁(yè)面設(shè)置對(duì)話框);if (dlg.exec() = qdialog:accepted)/ 進(jìn)行下一步處理 else if(btn = progresspushbtn)/進(jìn)度對(duì)話框.qprogressdialog progress(tr(正在復(fù)制文件.), tr(取消), 0, 10000, this);progress.setwindowmodality(qt:windo

28、wmodal);/設(shè)置為模態(tài)對(duì)話框progress.setwindowtitle(tr(進(jìn)度對(duì)話框);progress.show();for (int i = 0; i processevents();if (progress.wascanceled()break;/. 復(fù)制文件處理qdebug() i;progress.setvalue(10000);else if(btn = printpushbtn)/ 打印對(duì)話框.qprinter printer;qprintdialog dlg(&printer, this);dlg.setwindowtitle(tr(打印對(duì)話框);if (dlg.

29、exec() = qdialog:accepted)/進(jìn)行下一步處理 /main function:builtin.cpp#include /(1)#include builtindlg.h int main(int argc, char* argv) qapplication app(argc, argv); /(2)qtextcodec:setcodecfortr(qtextcodec:codecforname(utf-8); /(3) cbuiltindlg dlg; /(4)return dlg.exec(); /(5)主函數(shù)的解釋其實(shí),通過(guò)實(shí)例分析:一般應(yīng)用程序的結(jié)構(gòu)總是:(1)頭文

30、件,builtindlg.h;(2)頭文件的實(shí)現(xiàn)函數(shù),builtindlg.cpp;(3)主函數(shù)。主函數(shù)一般都是固定的那些內(nèi)容(如上邊實(shí)例所示)。按照后邊的注釋數(shù)字來(lái)解釋。(1)頭文件,包含了qt用戶界面頭文件qtgui。qtgui頭文件包含了qtcore模塊和qtgui模塊的所有qt類的定義。由于在類cbuiltindlg的實(shí)現(xiàn)文件builtlndlg.cpp中用到很多qtcore類和qtgui類,通過(guò)包含qtgui頭文件,可以避免一 一包含所要使用的qt類頭文件。(2)創(chuàng)建一個(gè)application對(duì)象并將用戶在控制臺(tái)輸入的參數(shù)傳遞給該應(yīng)用程序?qū)ο?。?)設(shè)置編碼格式為utf8,國(guó)際統(tǒng)一編

31、碼格式。(4)實(shí)例化cbuiltindlg類,創(chuàng)建一個(gè)對(duì)象句柄。(5)返回對(duì)象的運(yùn)行結(jié)果。模態(tài)對(duì)話框和非模態(tài)對(duì)話框模態(tài)對(duì)話框就是指在子對(duì)話框彈出時(shí),焦點(diǎn)被強(qiáng)行集中于該子對(duì)話框,子對(duì)話框不關(guān)閉,用戶將無(wú)法操作其他的窗口。非模態(tài)相反,用戶仍然可以操作其他的窗口,包括該子對(duì)話框的父對(duì)話框。如果從線程角度來(lái)講,模態(tài)對(duì)話框?qū)嶋H上是線程阻塞的,也就是子對(duì)話框是一個(gè)線程,但是在創(chuàng)建這個(gè)子線程之后,父窗口就阻塞了;模態(tài)對(duì)話框則不是阻塞型的線程模型,父子線程可以并行運(yùn)行。和所有流行的圖形類庫(kù)一樣,qt也提供了創(chuàng)建模態(tài)和非模態(tài)對(duì)話框的機(jī)制。在qt中創(chuàng)建模態(tài)對(duì)話框,主要用到了qdialog的exec函數(shù):sondi

32、alog dlg(this);int res = dlg.exec();if (res = qdialog:accepted)qmessagebox:information(this, tr(提示),tr(您單擊了ok按鈕!);if (res = qdialog:rejected)qmessagebox:information(this, tr(提示),tr(“您單擊了cancel按鈕!”);正如上面代碼所顯示的,可以通過(guò)exec函數(shù)的返回值來(lái)判斷用戶點(diǎn)擊了哪個(gè)按鈕使得模態(tài)對(duì)話框退出的,這可以使得我們能夠根據(jù)用戶的不同行為在推出退出模態(tài)對(duì)話框之后采取不同的處理方法。在qt中創(chuàng)建非模態(tài)對(duì)話框,主

33、要用到了qdialog的show函數(shù):sondialog *dlg;dlg = new sondialog(this);dlg-show();由上面代碼,細(xì)心的讀者可能就會(huì)問(wèn)了,既然new了,如果不delete,那么內(nèi)存不就存在了泄露的問(wèn)題了嗎?確實(shí)如此!所以,我們希望該qt窗口在退出時(shí)自動(dòng)能夠delete掉自己,因此,我們?cè)趕ondialog的構(gòu)造函數(shù)里,添加這樣的一句代碼:setattribute (qt:wa_deleteonclose);這樣,我們的sondialog就能夠在它退出時(shí)自動(dòng)的delete掉自己了,不會(huì)再造成內(nèi)存泄漏問(wèn)題。qt-designer設(shè)計(jì)器將設(shè)計(jì)的窗口界面導(dǎo)入應(yīng)用程序中利用qt中的設(shè)計(jì)器進(jìn)行界面開發(fā)效率較高。而且簡(jiǎn)單易學(xué)。在qt-designer中設(shè)計(jì)好了界面之后,處理過(guò)程如下:(1)設(shè)計(jì)完成后,保存后是一個(gè)“*.ui”文件。(2)在終端輸入一下命令:uic -o ui_*.h *.ui或者uic *.ui(后者直接輸出到控制臺(tái))。這一步是利用qt提供的qmake工具和uic編譯工具將生成的*.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論