基于Qt的電子相冊(cè)說明書_第1頁(yè)
基于Qt的電子相冊(cè)說明書_第2頁(yè)
基于Qt的電子相冊(cè)說明書_第3頁(yè)
基于Qt的電子相冊(cè)說明書_第4頁(yè)
基于Qt的電子相冊(cè)說明書_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

畢業(yè)設(shè)計(jì)說明書基于QT的記事本和電子相冊(cè)學(xué)生姓名:學(xué)號(hào):學(xué)院:專業(yè):指導(dǎo)教師:2023年6月基于QT的記事本和電子相冊(cè)摘要越來越多的設(shè)備需要一個(gè)圖形化的人機(jī)接口界面〔GUI〕,良好的人機(jī)交互界面是各個(gè)軟件系統(tǒng)設(shè)計(jì)的一個(gè)關(guān)鍵技術(shù),尤其是在給廣闊人們的使用中,對(duì)程序的實(shí)用性、美觀性和視聽娛樂性提出了更高的要求。而記事本和電子相冊(cè)以其實(shí)用性和良好的欣賞性逐漸成為人們查看和使用中不可或缺的組成局部。開發(fā)基于Qt的界面美觀、功能豐富的記事本和電子相冊(cè),具有一定的實(shí)用意義和價(jià)值。本文的目標(biāo)是設(shè)計(jì)和實(shí)現(xiàn)基于Qt的記事本和電子相冊(cè)。論文首先介紹了Qt的優(yōu)點(diǎn)和Qt開發(fā)環(huán)境的搭建,著重分析了Qt在軟件開發(fā)中的編程機(jī)制。并根據(jù)嵌入式應(yīng)用的特點(diǎn)對(duì)基于Qt的記事本和電子相冊(cè)進(jìn)行了設(shè)計(jì)需求分析、具體界面的設(shè)計(jì)和整體結(jié)構(gòu)的設(shè)計(jì)。本課題根據(jù)記事本和電子相冊(cè)的算法,設(shè)計(jì)并實(shí)現(xiàn)了記事本的相關(guān)功能〔如:新建、翻開、編輯和刪除文件等〕和電子相冊(cè)的相關(guān)功能。最后對(duì)關(guān)于論文進(jìn)一步工作的方向進(jìn)行了簡(jiǎn)要的討論。關(guān)鍵字:Qt,圖形用戶界面,記事本,電子相冊(cè) EmbeddedterminalapplicationprogramdevelopmentbasedonQT——DevelopmentofnotepadandelectronicalbumAbstractMoreandmoreembbededEmbeddedTerminalneedgraphicsuserinterface(GUI).AgoodHuman-ComputerInteractioninterfaceisthekeytechnologyofembeddedsystemdesign.Higherdemandsofthepracticality,aestheticsandaudio-visualentertainmentofembeddedterminalareneeded,especiallyinembbededsystemhandhelddevice.Notepadandelectronicphotoalbumarebecominganintegralpartofembeddeddevicefortheirpracicalityandgoodviewing.Ithassomepracticalsignificanceandvaluetodevelopanotepadandanalbumwithbeautifulinterface,richfunctionsandgoodinteractionbasedonembeddedterminal.Theaimofthispaperistodesignandimplementanotepadandanalbumintheembededterminalenvironment.ThispaperpresentedtheadvantageofLinuxandthebuildingofQTdevelopingenvironment,focusedontheprogrammingmechanismofdevelopingsoftwarewithQt.Itanalysedtheneedsofthedesign,designedthespecificinterfaceandoverallstructureofnotepadandalbumintheembededterminalenvironmentaccordingtofeaturesofembeddedapplication.Thisprojectdesignedandimplementedtherelevantfunctionsofnorepad(suchasnewfile,openfile,editfileanddeletefile)aswellastherelevantfunctionsofalbum(suchasenlarge、minify、rotateandmovethepicture)basedonthealgorithmsofnotepadandalbum.Finally,briefdisscusionaboutthefurtherreaserchofthispaperwaspresented.Keywords:Qt,GUI,notepad,alb目錄1引言1課題研究背景和意義11.2基于Qt的軟件技術(shù)開展現(xiàn)狀和未來11.2.1標(biāo)志性的產(chǎn)品已露頭角11.2.2基于Qt的軟件技術(shù)面臨挑戰(zhàn)21.3課題研究?jī)?nèi)容22Qt簡(jiǎn)介32.1Qt開發(fā)工具簡(jiǎn)介32.1.1Qt主要特性32.1.2Qt編程機(jī)制簡(jiǎn)介33嵌入式終端應(yīng)用程序之記事本和電子相冊(cè)架構(gòu)設(shè)計(jì)63.1記事本架構(gòu)設(shè)計(jì)63.1.1記事本設(shè)計(jì)需求63.1.2記事本界面設(shè)計(jì)63.1.3記事本結(jié)構(gòu)設(shè)計(jì)93.2電子相冊(cè)架構(gòu)設(shè)計(jì)103.2.1電子相冊(cè)設(shè)計(jì)需求103.2.2電子相冊(cè)界面設(shè)計(jì)113.2.3電子相冊(cè)結(jié)構(gòu)設(shè)計(jì)134算法設(shè)計(jì)和實(shí)現(xiàn)154.1記事本主要算法設(shè)計(jì)和實(shí)現(xiàn)154.1.1記事本類結(jié)構(gòu)設(shè)計(jì)154.1.2記事本功能實(shí)現(xiàn)154.1.3記事本代碼實(shí)現(xiàn)164.2電子相冊(cè)主要算法設(shè)計(jì)和實(shí)現(xiàn)214.2.1電子相冊(cè)類結(jié)構(gòu)設(shè)計(jì)214.2.2電子相冊(cè)功能實(shí)現(xiàn)224.2.3電子相冊(cè)代碼實(shí)現(xiàn)235總結(jié)31參考文獻(xiàn)32致謝331引言課題研究背景和意義隨著各種電子產(chǎn)品的不斷開展和不斷的進(jìn)步,現(xiàn)在往往要求用戶操作系統(tǒng)有圖形化的功能。一個(gè)擁有良好舒適的圖形化界面的程序可以使用戶更加喜歡和更好的運(yùn)用軟件進(jìn)行操作[1]。雖然市場(chǎng)上現(xiàn)在已經(jīng)有了眾多的優(yōu)秀的GUI應(yīng)用軟件,但隨著近年來計(jì)算機(jī)技術(shù)的迅速開展,當(dāng)新硬件、新技術(shù)出現(xiàn)時(shí),計(jì)算機(jī)的體系結(jié)構(gòu)、指令系統(tǒng)和操作系統(tǒng)都可能發(fā)生相應(yīng)的改變,這勢(shì)必會(huì)導(dǎo)致一局部應(yīng)用軟件在新環(huán)境下無(wú)法正常運(yùn)行[2]。如果舍棄原有軟件而重新開發(fā),將會(huì)消耗大量的人力和資金,而且浪費(fèi)了許多成熟的軟件成果。而Qt是1991年奇趣科技開發(fā)的一個(gè)跨平臺(tái)的C++圖形用戶界面應(yīng)用程序框架[3]。它提供應(yīng)應(yīng)用程序開發(fā)者簡(jiǎn)歷藝術(shù)級(jí)的圖形用戶所需的所有功能。Qt很容易擴(kuò)展,并且允許真正地組件編程。在源代碼級(jí)上實(shí)現(xiàn)了跨平臺(tái)特性,極大的支持了跨平臺(tái)通用軟件的開發(fā)。Qt可以用同一個(gè)源程序在不同平臺(tái)上編譯鏈接,生成目標(biāo)代碼,并取得相同的運(yùn)行效果,稱為“一次編寫,隨處編譯〞,利用這種方法充分實(shí)現(xiàn)了程序的跨平臺(tái)運(yùn)行[4]。這種基于源代碼的跨平臺(tái)特性不僅解決了性能的問題,而且可以發(fā)揮各個(gè)平臺(tái)的優(yōu)勢(shì),充分利用每個(gè)平臺(tái)自身的特點(diǎn);并且既可以在新環(huán)境下實(shí)現(xiàn)原有軟件的功能和特點(diǎn),減少開發(fā)費(fèi)用,還可以改良原有軟件的缺乏,增加新的需求,從而提高軟件的質(zhì)量,延長(zhǎng)軟件生命期。因此,基于Qt的應(yīng)用程序軟件的開發(fā)是一個(gè)非常有意義的課題,具有重要的研究和商業(yè)價(jià)值。1.2基于Qt的軟件技術(shù)開展現(xiàn)狀和未來1.2.1標(biāo)志性的產(chǎn)品已露頭角計(jì)算機(jī)應(yīng)用的普及、互聯(lián)網(wǎng)技術(shù)的實(shí)用以及納米微電子技術(shù)的突破,正有力推動(dòng)著21世紀(jì)工業(yè)生產(chǎn)、商業(yè)活動(dòng)、科學(xué)實(shí)驗(yàn)和家庭生活等領(lǐng)域自動(dòng)化和信息化進(jìn)程。全過程自動(dòng)化產(chǎn)品制造、大范圍電子商務(wù)活動(dòng)、高度協(xié)同科學(xué)實(shí)驗(yàn)以及現(xiàn)代化家庭起居,為嵌入式產(chǎn)品造就了嶄新而巨大的商機(jī)。除了溝通信息高速公路的交換機(jī)、路由器和Modem,構(gòu)建CIMS所需的DCS和機(jī)器人以及規(guī)模較大的家用汽車電子系統(tǒng)[5]。最有量產(chǎn)效益和時(shí)代特征的嵌入式產(chǎn)品應(yīng)數(shù)因特網(wǎng)上的信息家電(InternetAppliances),如Web可視、Web游戲機(jī)、WebPDA(俗稱電子商務(wù)、商務(wù)通)、WAP、以及多媒體產(chǎn)品,如STB(電視機(jī)頂盒)、DVD播放機(jī)、電子閱讀機(jī)[6]。1.2.2基于Qt的軟件技術(shù)面臨挑戰(zhàn) 以信息家電為代表的互聯(lián)網(wǎng)時(shí)代基于Qt的產(chǎn)品,不僅為軟件應(yīng)用市場(chǎng)展現(xiàn)了美好前景,注入了新的生命;同時(shí)也對(duì)軟件技術(shù)提出新的挑戰(zhàn)。這主要包括:支持日趨增長(zhǎng)的功能密度、靈活的網(wǎng)絡(luò)聯(lián)接、輕便的移動(dòng)應(yīng)用和多媒體的信息處理,此外,當(dāng)然還需對(duì)付更加劇烈的市場(chǎng)競(jìng)爭(zhēng)。1.3課題研究?jī)?nèi)容針對(duì)各種不同應(yīng)用平臺(tái)產(chǎn)品的高度個(gè)性化,其外觀、與用戶交互的界面千差萬(wàn)別的特點(diǎn),故而系統(tǒng)的設(shè)計(jì)目標(biāo)是意在打造一個(gè)能在各產(chǎn)品用戶端運(yùn)行、通用的、可以方便的支持各種控件、各種圖形格式,具有體積小、可裁剪、可移植的這樣一個(gè)面向用戶的應(yīng)用程序系統(tǒng),使各種不同的設(shè)備能具有美觀的用戶界面,相比照擬豐富的功能,操作起來簡(jiǎn)單而又直觀[7]。本文通過對(duì)Window和Qt的分析,在Window下Qt的根底上,開發(fā)了面向Windows終端的記事本和電子相冊(cè)應(yīng)用軟件。記事本可以將文件下的記事本文件以其原有存放的形式顯示出來,并可以實(shí)現(xiàn)記事本文件的新建、翻開、編輯和內(nèi)容保存等功能。電子相冊(cè)不僅支持一些圖片文件的瀏覽,刪除等的功能而且還支持圖片的放大、縮小、旋轉(zhuǎn)以及圖片以幻燈片形式播放和暫停等功能。他們體積小,移植方便,適用于很多的系統(tǒng)[8]。此外它作為一種小型GUI解決方案,可用于那些對(duì)GUI大小要求苛刻的各種應(yīng)用系統(tǒng)中[9]。2Qt簡(jiǎn)介2.1Qt開發(fā)工具簡(jiǎn)介2.1.1Qt主要特性Qt是一個(gè)跨平臺(tái)的C++圖形用戶界面庫(kù),由挪威TrollTech公司開發(fā),目前包括Qt/X11、基于Framebuffer的Qt/Embedded、快速開發(fā)工具QtDesigner以及國(guó)際化工具QtLinguist等。人們所熟知的Linux下面的KDE環(huán)境就是基于Qt開發(fā)而成的。Qt支持Unix和Linux系統(tǒng)以及Windows系統(tǒng)。Qt的主要特點(diǎn)有:面向?qū)ο?,很容易擴(kuò)展,并且允許真正的組件編程;Qt對(duì)各個(gè)模塊進(jìn)行了良好的封裝,使各模塊可重用性較好;優(yōu)良的跨平臺(tái)特性,使用Qt類編寫的程序可以實(shí)現(xiàn)“一次編碼,到處編譯〞[10],極大的降低了跨平臺(tái)開發(fā)的難度;構(gòu)件支持,對(duì)于對(duì)象間通信,Qt沒有采用函數(shù)回調(diào)的方法,而是采用了一種全新并且可選的被稱為“信號(hào)與槽〞的對(duì)象間通信機(jī)制,通過一個(gè)對(duì)象信號(hào)的發(fā)射,另一個(gè)槽函數(shù)的響應(yīng),使各個(gè)對(duì)象之間的通信平安而且高效。Qt的這些特點(diǎn)使它非常適合于真正的構(gòu)件編程,同時(shí)使各個(gè)組件之間的協(xié)同工作變得十分簡(jiǎn)單,并且Qt是直接基于Xlib的,不依賴Motif工具包,所以它的執(zhí)行效率比一般的基于平臺(tái)的代碼的執(zhí)行效率要高。2.1.2Qt編程機(jī)制簡(jiǎn)介〔1〕QT的信號(hào)與槽機(jī)制介紹信號(hào)和槽機(jī)制是QT的核心機(jī)制,要精通QT編程就必須對(duì)信號(hào)和槽有所了解。信號(hào)和槽是一種高級(jí)接口,應(yīng)用于對(duì)象之間的通信,它是QT的核心特性,也是QT區(qū)別于其它工具包的重要地方。信號(hào)和槽是QT自行定義的一種通信機(jī)制,它獨(dú)立于標(biāo)準(zhǔn)的C/C++語(yǔ)言,因此要正確的處理信號(hào)和槽,必須借助一個(gè)稱為moc〔MetaObjectCompiler〕的QT工具,該工具是一個(gè)C++預(yù)處理程序,它為高層次的事件處理自動(dòng)生成所需要的附加代碼。在我們所熟知的很多GUI工具包中,窗口小部件(widget)都有一個(gè)回調(diào)函數(shù)用于響應(yīng)它們能觸發(fā)的每個(gè)動(dòng)作,這個(gè)回調(diào)函數(shù)通常是一個(gè)指向某個(gè)函數(shù)的指針[11]。但是,在QT中信號(hào)和槽取代了這些凌亂的函數(shù)指針,使得我們編寫這些通信程序更為簡(jiǎn)潔明了。信號(hào)和槽能攜帶任意數(shù)量和任意類型的參數(shù),他們是類型完全平安的,不會(huì)像回調(diào)函數(shù)那樣產(chǎn)生coredumps[12]。所有從QObject或其子類(例如Qwidget)派生的類都能夠包含信號(hào)和槽。當(dāng)對(duì)象改變其狀態(tài)時(shí),信號(hào)就由該對(duì)象發(fā)射(emit)出去,這就是對(duì)象所要做的全部事情,它不知道另一端是誰(shuí)在接收這個(gè)信號(hào)[13]。這就是真正的信息封裝,它確保對(duì)象被當(dāng)作一個(gè)真正的軟件組件來使用。槽用于接收信號(hào),但它們是普通的對(duì)象成員函數(shù)。一個(gè)槽并不知道是否有任何信號(hào)與自己相連接。而且,對(duì)象并不了解具體的通信機(jī)制。信號(hào)和槽的機(jī)制是類型平安的:一個(gè)信號(hào)的簽名必須與它的接收槽的簽名相匹配?!矊?shí)際上一個(gè)槽的簽名可以比它接收的信號(hào)的簽名少,因?yàn)樗梢院雎灶~外的簽名?!骋?yàn)楹灻且恢碌模幾g器就可以幫助我們檢測(cè)類型不匹配。它以警告的方式報(bào)告類型錯(cuò)誤,而不會(huì)使系統(tǒng)產(chǎn)生崩潰。信號(hào)和槽是寬松地聯(lián)系在一起的:一個(gè)發(fā)射信號(hào)的類不用知道也不用注意哪個(gè)槽要接收這個(gè)信號(hào)[14]。Qt的信號(hào)和槽的機(jī)制可以保證如果你把一個(gè)信號(hào)和一個(gè)槽連接起來,槽會(huì)在正確的時(shí)間使用信號(hào)的參數(shù)而被調(diào)用。信號(hào)和槽可以使用任何數(shù)量、任何類型的參數(shù)。它們是完全類型平安的:不會(huì)再有回調(diào)核心轉(zhuǎn)儲(chǔ)(coredump)。你可以將很多信號(hào)與單個(gè)的槽進(jìn)行連接,也可以將單個(gè)的信號(hào)與很多的槽進(jìn)行連接,甚至于將一個(gè)信號(hào)與另外一個(gè)信號(hào)相連接也是可能的,這時(shí)無(wú)論第一個(gè)信號(hào)什么時(shí)候發(fā)射系統(tǒng)都將立刻發(fā)射第二個(gè)信號(hào)。總之,信號(hào)與槽構(gòu)造了一個(gè)強(qiáng)大的部件編程機(jī)制??傮w來看,信號(hào)和槽構(gòu)成了一個(gè)強(qiáng)有力的組件編程機(jī)制。如果一個(gè)類要使用信號(hào)與槽機(jī)制,它就必須是從QObject或QObject的子類繼承,而且類的定義必須加上Q_OBJECT宏。signals、slots和emit是Qt特有的關(guān)鍵字,分別用來表示信號(hào)、槽、和發(fā)送信號(hào),移除這些關(guān)鍵字和預(yù)處理程序,就可以使用標(biāo)準(zhǔn)的C++編譯器。槽同其他函數(shù)一樣也具有訪問權(quán)限,只是槽的訪問權(quán)限決定了誰(shuí)可以和它相連,如一個(gè)publicslots:包含了任何信號(hào)都可以相連的槽(AndrewKrause,2007)。一個(gè)protectedslots:包含了只有這個(gè)類和它的子類的信號(hào)才能連接的槽。這就是說這些槽只是類的實(shí)現(xiàn)的一局部,而不是它和外界的接口。一個(gè)privateslots:包含了只有這個(gè)類本身的信號(hào)可以連接的槽,甚至它的子類都沒有獲得連接的權(quán)利。(2)Qt元對(duì)象系統(tǒng)Qt中的元對(duì)象系統(tǒng)是用來處理對(duì)象間通訊的信號(hào)/槽機(jī)制、運(yùn)行時(shí)的類型信息和動(dòng)態(tài)屬性系統(tǒng)。它基于以下三類:QObject類、類聲明中的私有段中的Q_OBJECT宏、元對(duì)象編譯器〔moc〕。moc讀取C++源文件。如果它發(fā)現(xiàn)其中包含一個(gè)或多個(gè)類的聲明中含有Q_OBJECT宏,它就會(huì)給含有Q_OBJECT宏的類生成另一個(gè)含有元對(duì)象代碼的C++源文件。這個(gè)生成的源文件可以被類的源文件包含〔#include〕到或者和這個(gè)類的實(shí)現(xiàn)一起編譯和連接。除了提供對(duì)象間通訊的信號(hào)和槽機(jī)制之外〔介紹這個(gè)系統(tǒng)的主要原因〕,QObject中的元對(duì)象代碼實(shí)現(xiàn)其它特征:className()函數(shù)在運(yùn)行的時(shí)候以字符串返回類的名稱,不需要C++編譯器中的本地運(yùn)行類型信息〔RTTI〕的支持。inherits()函數(shù)返回這個(gè)對(duì)象是否是一個(gè)繼承于QObject繼承樹中一個(gè)特定類的類的實(shí)例。tr()和trUtf8()兩個(gè)函數(shù)是用于國(guó)際化中的字符串翻譯。setProperty()函數(shù)和property()函數(shù),這兩個(gè)函數(shù)是用來通過名稱動(dòng)態(tài)設(shè)置和獲得對(duì)象屬性的。metaObject()函數(shù)返回這個(gè)類所關(guān)聯(lián)的元對(duì)象。雖然使用QObject作為一個(gè)基類而不使用Q_OBJECT宏和元對(duì)象代碼是可以的,但是如果Q_OBJECT宏沒有被使用,那么這里的信號(hào)和槽以及其它特征描述都不會(huì)被提供。根據(jù)元對(duì)象系統(tǒng)的觀點(diǎn),一個(gè)沒有元代碼的QObject的子類和它含有元對(duì)象代碼的最近的祖先相同。舉例來說就是,className()將不會(huì)返回你的類的實(shí)際名稱,返回的是它的這個(gè)祖先的名稱。故強(qiáng)烈建議QObject的所有子類使用Q_OBJECT宏,而不管它們是否實(shí)際使用了信號(hào)、槽和屬性[15]。3嵌入式終端應(yīng)用程序之記事本和電子相冊(cè)架構(gòu)設(shè)計(jì)3.1記事本架構(gòu)設(shè)計(jì)3.1.1記事本設(shè)計(jì)需求記事本可以講文件下的記事本文件按文本的形式顯示出來,并可以實(shí)現(xiàn)記事本文件的新建、翻開、編輯和文本的刪除等功能;記事本可以根據(jù)文件內(nèi)容的多少來實(shí)現(xiàn)文本的滾動(dòng)顯示,可以通過計(jì)算機(jī)鍵盤對(duì)文本進(jìn)行快速的編輯等。(1)記事本新建功能:可以創(chuàng)立一個(gè)新的記事本文件。(2)翻開記事本的功能:根據(jù)文件列表選擇翻開指定的文件,翻開指定文件時(shí),顯示翻開文件的文件內(nèi)容在文件編輯界面上,文件內(nèi)容過多時(shí)可以滾動(dòng)顯示,并在文件編輯界面的上方滾動(dòng)顯示翻開的文件的文件名。(3)控制記事本編輯格式功能:編輯文件時(shí),文本內(nèi)容輸入到當(dāng)前界面的右端邊界處自動(dòng)換行,也可以利用鍵盤操作執(zhí)行換行動(dòng)作。輸入的文本內(nèi)容多于當(dāng)前屏幕顯示范圍時(shí)出現(xiàn)縱向滾動(dòng)條,隨著文本輸入滾動(dòng)顯示內(nèi)容。(4)記事本內(nèi)容修改提示功能:假設(shè)在翻開的文件中對(duì)其內(nèi)容進(jìn)行了修改,在關(guān)閉文件時(shí)將會(huì)提示文件的內(nèi)容已經(jīng)被修改的消息,用戶可選擇是否保存修改后的內(nèi)容。(5)記事本內(nèi)容增刪改查功能:在翻開記事本文件后,可以對(duì)記事本文件中的內(nèi)容進(jìn)行編輯,如增加、刪除、修改、撤銷修改、查找等。這一旦發(fā)生變化,那么在選擇保存后,文件列表的文件也發(fā)生了改變。(6)記事本保存功能:可以對(duì)操作了的記事本文件進(jìn)行保存,在選擇保存記事本文件后,文件名立即顯示在文件列表上。3.1.2記事本界面設(shè)計(jì)(1)新建文件編輯界面:如下圖,界面上方顯示功能界面名稱。工具欄上面有各種操作的按鈕,中間區(qū)域?yàn)槲谋揪庉媴^(qū),用于接收文本的輸入,界面下方有提示和日期時(shí)間的顯示。界面可以實(shí)現(xiàn)擴(kuò)大縮小的功能。圖3.1記事本界面〔2〕翻開文件內(nèi)容顯示界面:如圖圖3.2所示,界面中間區(qū)域?yàn)槲募?nèi)容的顯示區(qū),可以接收文本的編輯和修改。界面下方左側(cè)為顯示文件導(dǎo)入完畢提示。圖3.2翻開記事本界面記事本功能菜單設(shè)計(jì):如圖3.3所示,記事本工具欄上依次為新建按鈕、翻開按鈕、保存按鈕、剪切按鈕、復(fù)制按鈕、粘貼按鈕、撤銷按鈕、查找按鈕以及返回上一界面按鈕。圖3.3記事本菜單界面記事本查找消息框設(shè)計(jì):如圖3.4所示,在輸入框中輸入要查找的內(nèi)容,點(diǎn)擊查找下一個(gè)按鈕,就會(huì)在顯示文本區(qū)域找到要查找的內(nèi)容并且會(huì)標(biāo)記出來。圖3.4記事本查找界面記事本消息提示框設(shè)計(jì):如圖3.5所示,消息提示框的顯示區(qū)域顯示提示動(dòng)畫和提示的內(nèi)容。界面的下方左側(cè)為確認(rèn)保存功能按鈕,下方中間為不保存按鈕,下方右側(cè)為取消操作按鈕。圖3.5記事本保存界面3.1.3記事本結(jié)構(gòu)設(shè)計(jì)如下圖,記事本界面是記事本的入口和出口。記事本通過調(diào)用文件列表功能菜單對(duì)文件執(zhí)行各種操作。在文件列表功能菜單中根據(jù)所選擇的菜單條目進(jìn)入相應(yīng)的功能界面,如新建文件編輯界面、文件顯示內(nèi)容界面等。各個(gè)界面都有自己的功能菜單,通過調(diào)用自己的功能菜單對(duì)當(dāng)前界面進(jìn)行下一步的操作,如當(dāng)新建文件界面顯示時(shí),可通過菜單按鈕進(jìn)行增加、刪除、修改和查找內(nèi)容的操作;當(dāng)翻開文件時(shí)在文件內(nèi)容的顯示界面上,,可通過菜單按鈕進(jìn)行增加、刪除、修改和查找內(nèi)容的操作以及可通過修改文件提示框選擇是否保存修改后的文件內(nèi)容。記事本界面記事本界面功能選擇翻開讀取文件內(nèi)容建立新文件功能選擇功能選擇增加內(nèi)容刪除內(nèi)容修改內(nèi)容查找內(nèi)容圖3.6記事本結(jié)構(gòu)設(shè)計(jì)3.2電子相冊(cè)架構(gòu)設(shè)計(jì)3.2.1電子相冊(cè)設(shè)計(jì)需求電子相冊(cè)支持jpg、png、gif、xpm和bmp格式圖片的瀏覽,并可以對(duì)圖片進(jìn)行放大、縮小或旋轉(zhuǎn)角度顯示。電子相冊(cè)還支持幻燈片模式瀏覽圖片,并可以對(duì)圖片進(jìn)行刪除等操作。在圖片文件所在目錄讀取所有擴(kuò)展名為jpg、xpm、png、bmp、gif格式的圖片文件,并將讀取的圖片文件按順序存放起來,在界面上顯示放入的第一張圖片。刪除圖片功能:對(duì)當(dāng)前界面上顯示的圖片可執(zhí)行刪除操作,刪除以后所查看的圖片中不再顯示已刪除的圖片并且顯示圖片位置和總數(shù)目的數(shù)據(jù)也相應(yīng)的發(fā)生變化。瀏覽圖片功能:對(duì)當(dāng)前顯示的圖片可以執(zhí)行瀏覽的功能,假設(shè)圖片原本大小超過圖片瀏覽區(qū)域〔即相框〕的大小,那么會(huì)自動(dòng)調(diào)整變成適應(yīng)圖片瀏覽區(qū)域的最大尺寸。假設(shè)圖片原本大小沒有超過圖片瀏覽區(qū)域大小,那么以原始尺寸在圖片瀏覽區(qū)域顯示??蓪?duì)翻開的圖片進(jìn)行放大、縮小、向左旋轉(zhuǎn)全屏模式與返回原始尺寸等一系列的瀏覽模式操作。圖片放大功能:在當(dāng)前圖片尺寸大小的根底上,圖片可逐級(jí)放大,以尺寸的0.25倍遞增,最大可放大到翻開圖片時(shí)顯示的初始尺寸的3倍。圖片縮小功能:在當(dāng)前圖片尺寸大小的根底上,圖片可逐級(jí)縮小。最小可縮小到翻開圖片時(shí)顯示的初始尺寸的0.333倍。圖片旋轉(zhuǎn)功能:翻開圖片后,可在圖片的任意狀態(tài)下對(duì)圖片進(jìn)行旋轉(zhuǎn)操作??稍诋?dāng)前狀態(tài)下,將圖片向左旋轉(zhuǎn),每次旋轉(zhuǎn)角度差值為90°。圖片旋轉(zhuǎn)后會(huì)自動(dòng)適應(yīng)窗口大小,完整顯示圖片。圖片全屏顯示功能:可以將圖片執(zhí)行全屏顯示。為了支持點(diǎn)擊操作,全屏顯示時(shí)不覆蓋相關(guān)功能按鈕?;脽羝J阶詣?dòng)瀏覽功能:可從當(dāng)前選定的圖片開始執(zhí)行自動(dòng)播放圖片功能,初始設(shè)定播放速度為1秒間隔。圖片查看功能:可以按上一張、下一張的按鈕用戶自行的對(duì)圖片進(jìn)行查看。給用戶提供友好的圖形交互界面,并合理安排界面元素布局,使其美觀并且方便用戶操作3.2.2電子相冊(cè)界面設(shè)計(jì)電子相冊(cè)功能菜單設(shè)計(jì):如圖3.7所示,界面上方顯示功能界面名稱,中間顯示區(qū)域?yàn)樗虞d的圖片的顯示。下面功能菜單欄依次為加載照片文件按鈕、原圖片大小顯示按鈕、圖片放大按鈕、圖片和屏幕一樣大小按鈕、圖片縮小按鈕、圖片旋轉(zhuǎn)按鈕、顯示上一張圖片按鈕、圖片顯示當(dāng)前位置和總照片數(shù)label、顯示下一張圖片按鈕、刪除當(dāng)前所顯示圖片按鈕、播放圖片幻燈片按鈕、暫停圖片幻燈片按鈕、返回上一界面按鈕和退出系統(tǒng)按鈕。圖3.7電子相冊(cè)界面如圖3.8所示,在點(diǎn)下旋轉(zhuǎn)按鈕以后,圖片會(huì)順時(shí)針旋轉(zhuǎn)90度顯示出來。使對(duì)圖片查看有更好的便捷。圖3.8圖片旋轉(zhuǎn)效果如圖3.9所示,在點(diǎn)下放大按鈕后,圖片將放大,在放大到一定比例后,放大按鈕將不可點(diǎn)擊。圖3.9圖片放大效果如圖3.10所示,在點(diǎn)下縮小按鈕后,圖片將縮小,在縮小到一定比例后,縮小按鈕將不可點(diǎn)擊。圖3.10圖片縮小如圖3.11所示,在點(diǎn)下恢復(fù)按鈕后,圖片將填充整個(gè)界面,此時(shí),不可以進(jìn)行放大,縮小功能,只有在點(diǎn)下原圖按鈕后放大縮小按鈕才可以繼續(xù)使用。圖3.11圖片適應(yīng)屏幕3.2.3電子相冊(cè)結(jié)構(gòu)設(shè)計(jì)如下圖,圖片列表界面為電子相冊(cè)的入口和出口。通過圖片列表功能菜單,可執(zhí)行翻開圖片進(jìn)行瀏覽的功能,并根據(jù)所選擇的功能進(jìn)入圖片瀏覽界面。進(jìn)入圖片瀏覽界面可通過圖片瀏覽功能菜單,對(duì)當(dāng)前顯示的圖片執(zhí)行各種操作,從而進(jìn)入相應(yīng)的圖片瀏覽界面。放大圖片的顯示,縮小圖片的顯示,旋轉(zhuǎn)圖片的顯示,刪除當(dāng)前圖片圖片全屏的顯示和自動(dòng)瀏覽圖片的顯示均將顯示在圖片瀏覽界面。而各種模式下的圖片瀏覽界面下,均可以通過功能菜單對(duì)其他瀏覽模式進(jìn)行選擇。翻開圖片翻開圖片功能選擇正常顯示圖片全屏顯示圖片自動(dòng)瀏覽顯示圖片放大顯示圖片縮小顯示圖片圖片旋轉(zhuǎn)圖片刪除圖片列表圖3.12電子相冊(cè)結(jié)構(gòu)設(shè)計(jì)4算法設(shè)計(jì)和實(shí)現(xiàn)4.1記事本主要算法設(shè)計(jì)和實(shí)現(xiàn)4.1.1記事本類結(jié)構(gòu)設(shè)計(jì)圖4.1記事本類圖4.1.2記事本功能實(shí)現(xiàn)記事本界面用到的控件主要有QLabel、QToolButton、QTextEdit等。記事本文件列表的實(shí)現(xiàn):首先掃描文件夾下的所有文件,包括隱藏的所有文件名,過濾記事本文件,并將這些記事本文件名根據(jù)創(chuàng)立時(shí)間的先后進(jìn)行排序存儲(chǔ)到文件鏈表中,將文件鏈表中的所有文件顯示在文件列表界面。流程圖如圖17。功能菜單的實(shí)現(xiàn):在記事本設(shè)計(jì)中有3個(gè)功能菜單界面,其中翻開和新建的功能菜單均繼承自記事本文件列表界面的功能菜單,這三個(gè)界面都含有一個(gè)QListBox控件,但是菜單項(xiàng)不同,并根據(jù)不同的菜單項(xiàng)實(shí)現(xiàn)不同的功能。流程圖如圖18。新建文件的實(shí)現(xiàn):首先提示輸入文件名,并檢查文件名的合法性。如果文件名不符合要求,那么設(shè)置文件名的輸入無(wú)效,并提示重新輸入。如果不輸入文件名那么提供默認(rèn)的文件名,進(jìn)入文本編輯界面,然后按照界面的寬度對(duì)文本輸入進(jìn)行限定,到界面寬度最大值時(shí)自動(dòng)換行。并且使文本保存時(shí)輸入到物理設(shè)備上時(shí)支持unicode編碼。流程圖如圖19。翻開文件功能的實(shí)現(xiàn):從文件列表選定翻開的文件,然后將文件內(nèi)容讀到QTextStream中再顯示在QTextEdit中,并且規(guī)定顯示格式。如果文件內(nèi)容被修改后,提示文件是否需要保存。如果通過菜單項(xiàng)選擇擇翻開下一個(gè)文件,那么查找到當(dāng)前文件的下一個(gè)文件,并將其文件內(nèi)容顯示于界面顯示區(qū)域上。4.1.3記事本代碼實(shí)現(xiàn)voidTest::newFile(){if(maybeSave()){ui->textEdit->clear();setCurrentFile("");}}//判斷是否選擇保存內(nèi)容boolTest::maybeSave(){if(ui->textEdit->document()->isModified()){QMessageBox::StandardButtonret;ret=QMessageBox::warning(this,tr("Application"),tr("Thedocumenthasbeenmodified.\n""Doyouwanttosaveyourchanges?"),QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel);if(ret==QMessageBox::Save){qDebug()<<"2";returnsave();}elseif(ret==QMessageBox::Cancel){qDebug()<<"3";returnfalse;}}returntrue;}//保存內(nèi)容如果原先不存在那么跳轉(zhuǎn)到saveAs()彈出對(duì)話框進(jìn)行保存如果存在那么使用當(dāng)前的路徑boolTest::save(){if(curFile.isEmpty()){returnsaveAs();}else{qDebug()<<"6";returnsaveFile(curFile);}}//彈出保存的對(duì)話框boolTest::saveAs(){QStringfileName=QFileDialog::getSaveFileName(this,tr("請(qǐng)確定"),"/","*.txt");qDebug()<<fileName;if(fileName.isEmpty()){qDebug()<<"7";returnfalse;}qDebug()<<"8";returnsaveFile(fileName+".txt");}boolTest::saveFile(constQString&fileName){QFilefile(fileName);//qDebug()<<"fileN";if(!file.open(QFile::WriteOnly|QFile::Text)){QMessageBox::warning(this,tr("Application"),tr("Cannotwritefile%1:\n%2.").arg(fileName).arg(file.errorString()));returnfalse;}QTextStreamout(&file);out<<ui->textEdit->toPlainText();setCurrentFile(fileName);ui->label->setText(tr("Filesaved"));qDebug()<<"10";returntrue;}//設(shè)置路徑voidTest::setCurrentFile(constQString&fileName){curFile=fileName;ui->textEdit->document()->setModified(false);setWindowModified(false);QStringshownName=curFile;if(curFile.isEmpty())shownName="wangrui.txt";setWindowFilePath(shownName);}//翻開文件voidTest::openFile(){if(maybeSave()){QStringfileName=QFileDialog::getOpenFileName(this,tr("請(qǐng)選擇"),"/","*.txt");if(!fileName.isEmpty())loadFile(fileName);}}voidTest::loadFile(constQString&fileName){QFilefile(fileName);if(!file.open(QFile::ReadOnly|QFile::Text)){QMessageBox::warning(this,tr("Application"),tr("Cannotreadfile%1:\n%2.").arg(fileName).arg(file.errorString()));return;}QTextStreamin(&file);ui->textEdit->setPlainText(in.readAll());setCurrentFile(fileName);ui->label->setText(tr("Fileloaded"));}voidTest::about(){QMessageBox::about(this,tr("AboutApplication"),tr("ThisProjectismadeby<b>WangRui</b>"));}voidTest::back(){this->hide();MainWindow*mw=newMainWindow;mw->show();}voidTest::time(){QDateTimecurrent_date_time=QDateTime::currentDateTime();QStringcurrent_date=current_date_time.toString("yyyy-MM-ddhh:mm:ssddd");ui->label_2->setText(current_date);}voidTest::find()//查找{QDialog*findDlg=newQDialog(this);findDlg->setWindowTitle(tr("查找"));find_textLineEdit=newQLineEdit(findDlg);QPushButton*find_Bth=newQPushButton(tr("查找下一個(gè)"),findDlg);QHBoxLayout*layout=newQHBoxLayout(findDlg);layout->addWidget(find_textLineEdit);layout->addWidget(find_Bth);findDlg->show();connect(find_Bth,SIGNAL(clicked()),this,SLOT(show_findText()));}voidTest::show_findText(){QStringfindText=find_textLineEdit->text();if(!ui->textEdit->find(findText,QTextDocument::FindBackward)){QMessageBox::warning(this,tr("查找"),tr("找不到%1").arg(findText));}}4.2電子相冊(cè)主要算法設(shè)計(jì)和實(shí)現(xiàn)4.2.1電子相冊(cè)類結(jié)構(gòu)設(shè)計(jì)圖4.2電子相冊(cè)類圖4.2.2電子相冊(cè)功能實(shí)現(xiàn)用戶進(jìn)入電子相冊(cè)后,首先需要點(diǎn)翻開按鈕選擇文件夾中的照片。圖片由imageList[]存放,將從當(dāng)前目錄下得到j(luò)pg、xpm、png、gif、bmp格式的圖片存入鏈表中,通過load函數(shù)加載圖片到一個(gè)QPixmap類型的變量中,然后將此變量與Label關(guān)聯(lián)起來,以實(shí)現(xiàn)圖片在Label上的顯示。值得注意的一點(diǎn)是,此Label上加載的圖片均為真實(shí)圖片的縮略圖,而不是圖片本身。如果圖片的縮略圖已經(jīng)存在,那么將縮略圖直接顯示在Label上,如果縮略圖不存在,那么生成圖片的縮略圖。如果該圖片文件為非法圖片格式文件,那么在該Label上載入一個(gè)標(biāo)志著讀取圖片文件失敗的圖片??s略圖是圖片的真實(shí)縮影,在剛翻開圖片顯示時(shí)保持原圖片的比例。刪除圖片功能實(shí)現(xiàn):在對(duì)當(dāng)前圖片界面上要進(jìn)行刪除操作時(shí),需注意兩點(diǎn),一點(diǎn)就是待刪除的圖片是否是圖片列表的最后一張圖片,假設(shè)是的話,那么刪除圖片后,被刪除圖片的前一張圖片呈現(xiàn)出在顯示圖片界面上。否那么,刪除圖片后,被刪除圖片的后一張呈現(xiàn)在顯示圖片界面上,且此圖片刪除后,圖片文件鏈表中刪除圖片節(jié)點(diǎn),其列表界面中圖片的位置要統(tǒng)一向前移動(dòng)一個(gè)位置圖片的放大功能的實(shí)現(xiàn):設(shè)定scaleImag()來記錄放大的倍數(shù),并且當(dāng)放大到最大倍數(shù)時(shí),將菜單項(xiàng)上的“放大〞按鈕變成不可點(diǎn)擊的狀態(tài),并且根據(jù)放大倍數(shù)在瀏覽區(qū)域的相框上繪制圖片。圖片縮小功能的實(shí)現(xiàn):可在圖片的任意大小狀態(tài)下進(jìn)行縮小,直到圖片縮小到初始翻開圖片顯示尺寸的0.333倍大小??s小圖片時(shí)要保證縮小后的圖片依然居于相框中間位置。在圖片非全屏模式和全屏模式兩種情況下,判定當(dāng)前狀態(tài)的圖片與初始時(shí)顯示的位置移動(dòng)的距離大小,并根據(jù)不同的圖片旋轉(zhuǎn)角度,據(jù)此距離大小計(jì)算并設(shè)定相應(yīng)的圖片在相框中的位置坐標(biāo)。圖片移動(dòng)功能實(shí)現(xiàn):圖片在放大到1.0倍以上時(shí),可進(jìn)行圖片在相框內(nèi)的上下或左右移動(dòng)顯示。圖片在全屏模式下選擇放大時(shí)圖片也可以進(jìn)行上下或左右移動(dòng)顯示。相框內(nèi)圖片顯示功能的實(shí)現(xiàn):不同的選擇下,相框內(nèi)的圖片顯示狀態(tài)是不同的。對(duì)于圖片的顯示需要考慮的情況有是否是全屏模式,當(dāng)前的縮放倍數(shù)和當(dāng)前的旋轉(zhuǎn)角度,并需要根據(jù)判斷圖片是否移動(dòng)來對(duì)顯示邊界進(jìn)行檢測(cè)及計(jì)算。根據(jù)圖片縮放和旋轉(zhuǎn)參數(shù)和檢測(cè)到的移動(dòng)距離,利用矩陣計(jì)算出新圖片所需的各個(gè)參數(shù),根據(jù)這些參數(shù)生成顯示在相框內(nèi)的圖片。最后將圖片繪制在相框內(nèi),即當(dāng)前的圖片瀏覽區(qū)內(nèi)。4.2.3電子相冊(cè)代碼實(shí)現(xiàn)voidImageShow::scaleImage(doublefactor){scaleFactor*=factor;imageLabel->resize(scaleFactor*imageLabel->pixmap()->size());adjustScrollBar(scrollArea->horizontalScrollBar(),factor);adjustScrollBar(scrollArea->verticalScrollBar(),factor);ui->actionBig->setEnabled(scaleFactor<3.0);ui->actionSmall->setEnabled(scaleFactor>0.333);}voidImageShow::adjustScrollBar(QScrollBar*scrollBar,doublefactor){//qDebug()<<factor;scrollBar->setValue(int(factor*scrollBar->value()+((factor-1)*scrollBar->pageStep()/2)));}voidImageShow::fangDa(){scaleImage(1.25);}voidImageShow::suoXiao(){scaleImage(0.8);}voidImageShow::fitToWindow(){scrollArea->setWidgetResizable(true);ui->actionBig->setEnabled(false);ui->actionSmall->setEnabled(false);ui->actionOpen->setEnabled(false);}voidImageShow::normal(){scrollArea->setWidgetResizable(false);ui->actionBig->setEnabled(true);ui->actionSmall->setEnabled(true);ui->actionOpen->setEnabled(true);imageLabel->adjustSize();scaleFactor=1.0;}//控件的失效與否voidImageShow::hideView(boolb){ui->actionFitToWindow->setEnabled(b);ui->actionBig->setEnabled(b);ui->actionSmall->setEnabled(b);ui->actionNormal->setEnabled(b);ui->actionXuanZuan->setEnabled(b);ui->actionDown->setEnabled(b);ui->actionUpper->setEnabled(b);ui->actionBegin->setEnabled(b);ui->actionStop->setEnabled(b);ui->actionDelete->setEnabled(b);}//使圖片旋轉(zhuǎn)90度voidImageShow::xuanZuan(){QMatrixmatrix;matrix.rotate(90.0);pix=pix.transformed(matrix,Qt::FastTransformation);imageLabel->setPixmap(pix);}//翻開圖片voidImageShow::open(){intk=0;QStringListlist=QFileDialog::getOpenFileNames(this,tr("請(qǐng)選擇"),"/","*.png*.jpg*.gif*.xpm*.bmp");for(it=list.begin();it<list.end();it++){imageList[k]=*it;k++;}j=list.size()-1;image_sum=QString::number(k);image_positon=QString::number(1);ui->actionNumber->setText(tr("%1/%2").arg(image_positon).arg(image_sum));pix.load(imageList[i]);imageLabel->setPixmap(pix);scaleFactor=1.0;imageLabel->adjustSize();hideView(true);ui->actionStop->setEnabled(false);}//下一張圖片voidImageShow::down(){timer.stop();i=i+1;if(i>j)i=0;pix.load(imageList[i]);imageLabel->setPixmap(pix);image_positon=QString::number(i+1);ui->actionNumber->setText(tr("%1/%2").arg(image_positon).arg(image_sum));}//上一張圖片voidImageShow::upper(){timer.stop();i=i-1;if(i<0)i=j;pix.load(imageList[i]);imageLabel->setPixmap(pix);//qDebug()<<pix;image_positon=QString::number(i+1);ui->actionNumber->setText(tr("%1/%2").arg(image_positon).arg(image_sum));}//圖片的加載voidImageShow::imageShow(){pix.load(imageList[i]);//先下載圖片pix=pix.scaled(imageLabel->width(),imageLabel->height(),Qt::KeepAspectRatio);//設(shè)置顯示圖片的大小和label的大小一致imageLabel->setPixmap(pix);//將圖片顯示在面板上image_positon=QString::number(i+1);ui->actionNumber->setText(tr("%1/%2").arg(image_positon).arg(image_sum));i++;if(i>j)i=0;}//照片開始播放voidImageShow::begin(){timer.start(1000);//每隔一秒開始顯示一張圖片ui->actionBegin->setEnabled(false);ui->actionStop->setEnabled(true);ui->actionOpen->setEnabled(false);}//照片播放的暫停voidImageShow::stop(){timer.stop();ui->actionBegin->setEnabled(true);ui->actionStop->setEnabled(false);ui->actionOpen->setEnabled(true);}voidImageShow::back(){this->hide();MainWindow*mw=newMainWindow;mw->show();}//刪除圖片voidImageShow::deletePicture(){pix.load(imageList[i]);if(j>=0){intm;imageList[i].remove(i,1);for(m=i;m<imag

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論