c++課程設(shè)計---qt圖形界面的日期類實現(xiàn)_第1頁
已閱讀1頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  計算機類</b></p><p><b>  課程設(shè)計報告</b></p><p>  2011 年 6月 8 日</p><p>  目 錄</p><p>  設(shè)計的目的和任務(wù)……………………………………………………頁碼 </p><

2、;p>  2 .設(shè)計要求………………………………………………………………頁碼</p><p>  3 .主要儀器設(shè)備(實驗用的軟硬件環(huán)境)……………………………頁碼</p><p>  4 .設(shè)計內(nèi)容………………………………………………………………頁碼</p><p>  4.1基本內(nèi)容………………………………………………………………頁碼</p&g

3、t;<p>  4.2基本效果………………………………………………………………頁碼</p><p>  4.3實驗分階段……………………………………………………………頁碼</p><p>  4.4 date類設(shè)計……………………………………………………………頁碼</p><p>  4.5類實現(xiàn)的基本函數(shù)……………………………………………………頁碼&

4、lt;/p><p>  4.6 Qt GUI圖形界面設(shè)計…………………………………………………頁碼</p><p>  4.6.1 基本控件設(shè)計………………………………………………頁碼</p><p>  4.6.2 Qt中的數(shù)據(jù)類型轉(zhuǎn)換………………………………………頁碼</p><p>  4.6.3 Qt圖形界面的圖形效果一………………………

5、…………頁碼</p><p>  4.6.4 Qt圖形界面的圖形效果二…………………………………頁碼</p><p>  4.6.5 設(shè)置程序圖標………………………………………………頁碼</p><p>  4.6.6 Qt程序的語言包……………………………………………頁碼</p><p>  4.7程序發(fā)布……………………………………………

6、…………………頁碼</p><p>  4.8程序在其他環(huán)境下的測試……………………………………………頁碼</p><p>  4.9效果展示………………………………………………………………頁碼</p><p>  5 .問題討論與分析………………………………………………………頁碼</p><p>  6 .結(jié)束語……………………………

7、……………………………………頁碼</p><p>  參考文獻……………………………………………………………………頁碼</p><p>  Qt圖形界面的日期類實現(xiàn)</p><p><b>  設(shè)計的目的和任務(wù)</b></p><p>  1.1鞏固和加深對面向?qū)ο蟪绦蛟O(shè)計(C++)課程的基本知識的理解和掌握。</

8、p><p>  1.2掌握C++語言面向?qū)ο蠡幊毯统绦蛘{(diào)試的基本技能。</p><p>  1.3提高運用面向?qū)ο蠼鉀Q實際問題的能力,考慮程序在實際操作時所可能產(chǎn)生的所有情況。</p><p>  1.4熟悉和掌握運用面向?qū)ο蟪绦蛟O(shè)計的方法,實現(xiàn)新的數(shù)據(jù)類型及其運算的定義。</p><p>  1.5培養(yǎng)獨立思考和解決能力,團隊協(xié)作能力,綜合運

9、用所學(xué)相關(guān)應(yīng)用知識的能力。</p><p>  1.6利用面向?qū)ο蠓椒ㄟM行基本的軟件設(shè)計,實現(xiàn)一些基本的軟件功能。</p><p>  1.7初步學(xué)會使用某種平臺框架用于創(chuàng)建圖形界面,并實現(xiàn)基本功能。</p><p>  任務(wù):完成日期計算的算法實現(xiàn)和類封裝、Qt GUI圖形界面的設(shè)計和實現(xiàn)</p><p><b>  設(shè)計要求&l

10、t;/b></p><p>  2.1定義一個描述日期的類date,其中聲明5個int型私有數(shù)據(jù)成員year、month、day、leap、wrong,分別用于描述日期的年、月、日和閏年以及錯誤標志。</p><p>  2.2 在date類中定義一個構(gòu)造函數(shù),用于初始化4個私有數(shù)據(jù)成員:date(long y,long m,long d); 3個整型參數(shù)分別表示年、月、日的初值,用

11、于使用3個整數(shù)來初始化對象的情形,如:data oneday(2000,10,28);另重載定義一個構(gòu)造函數(shù):date(char *s);參數(shù)為表示初始日期的字符串,用于以一個日期字符串來初始化日期對象的情形,如:data oneday(“2000-10-28”);</p><p>  2.3 在date類中定義如下公有的函數(shù)成員:</p><p>  void Input();// 輸入

12、日期函數(shù)</p><p>  void Output();// 輸出日期函數(shù),格式為:xxxx年xx月xx日</p><p>  date Nextdate();// 返回當(dāng)前日期的下一日</p><p>  date Pirrodate();// 返回當(dāng)前日期的上一日</p><p>  date Dateafter(long d); //

13、 返回d日后的日期</p><p>  date Datebefore(long d); // 返回d日前的日期</p><p>  bool LeapYear(long &);// 判定閏年</p><p>  friend long DayBetween(date &,date &);// 返回兩個日期之間的天數(shù)</p>&

14、lt;p>  friend bool DateToStr(date &, char *);// 日期轉(zhuǎn)換成字符串函數(shù)</p><p>  friend bool StrToDate(char *,date &);// 字符串轉(zhuǎn)換成日期函數(shù)</p><p>  主要儀器設(shè)備(實驗用的軟硬件環(huán)境)</p><p>  4.1 IDE:Qt Crea

15、ter 2.2</p><p>  4.2 庫:Qt-everywhere-4.7.3 靜態(tài)庫</p><p>  4.3 工具鏈:Mingw as a GCC for Windows targets</p><p>  4.4 編譯方式:靜態(tài)編譯</p><p>  4.5 運行環(huán)境:Windows7 x86</p><

16、p><b>  設(shè)計內(nèi)容</b></p><p>  4.1 基本內(nèi)容:設(shè)計一個能處理包含年、月、日信息的日期數(shù)據(jù)的自定義類型。實現(xiàn)日期數(shù)據(jù)的多種運算。諸如:日期的初始化(整數(shù)或字符串)、日期數(shù)據(jù)字符串的相互轉(zhuǎn)換、日期的加、減運算等。并編寫主函數(shù)測試日期類,最后實現(xiàn)一個圖形界面。</p><p><b>  4.2 基本效果:</b><

17、;/p><p><b>  GUI效果:</b></p><p><b>  終端效果:</b></p><p><b>  實驗分階段</b></p><p> ?。?).先以終端程序的方式寫好非GUI的程序,通過一個簡單的主函數(shù)測試各個功能。</p><p&

18、gt; ?。?).在以上成功的基礎(chǔ)上將成功的代碼在Qt Creater中加上圖形界面,對圖形界面進行設(shè)計,從而實現(xiàn)一個簡單的日期計算器的GUI程序。</p><p>  date類設(shè)計:要求的基礎(chǔ)上在類中加上如下輔助函數(shù)</p><p>  long GetYear(){return year;}//獲得年份</p><p>  long GetMonth(){re

19、turn month;}//獲得月份</p><p>  long GetDay(){return day;}//獲得日期</p><p>  long GetLeap(){return leap;}//獲得閏年</p><p>  long GetWrong(){return wrong=1;}//獲得錯誤標志</p><p>  date

20、 operator+(long days);//重載+天數(shù)運算符</p><p>  date operator-(long days);//重載-天數(shù)運算符</p><p>  long operator-(date &);//重載兩date的-運算符</p><p>  long DateRule(long ,long ,long );//日期的規(guī)則&l

21、t;/p><p>  long SumDays(date &);//判斷當(dāng)天為當(dāng)年的第幾天</p><p>  long MonthExDays(date &);//判斷當(dāng)月有多少天</p><p>  以上函數(shù)中通過加減函數(shù)重載方便日期的前一天和前一段時間以及后一天和后一段時間的計算,從而使整個類更簡練清晰易懂。</p><p>

22、;<b>  類實現(xiàn)的基本函數(shù):</b></p><p>  //使用二維數(shù)組對當(dāng)天為這一年的第幾天進行計算,當(dāng)月天數(shù)與此類似</p><p>  long date::SumDays(date &y)</p><p><b>  {</b></p><p>  const long _Su

23、mDays[3][14]=</p><p><b>  {</b></p><p>  {0,0,31,59,90,120,151,181,212,243,273,304,334},</p><p>  {0,0,31,60,91,121,152,182,213,244,274,305,335}</p><p><

24、b>  };</b></p><p>  long sum=_SumDays[y.leap][y.month]+y.day;</p><p>  return sum;</p><p><b>  }</b></p><p>  //日期N天后的重載函數(shù)</p><p>  da

25、te date::operator+(long days)</p><p><b>  {</b></p><p>  date temp=*this;</p><p><b>  long det;</b></p><p>  //對加上的天數(shù)分為天數(shù)大于一年和小于一年兩種方式進行計算,并以遞歸計

26、算的方式得到結(jié)果</p><p>  if( days<= (det=365+leap-SumDays(temp)) )</p><p><b>  {</b></p><p><b>  long tmp;</b></p><p>  if( days<=(tmp=MonthExDay

27、s(temp)-day) )</p><p>  temp.day=day+days;</p><p><b>  else</b></p><p><b>  {</b></p><p>  days-=tmp+1;</p><p>  temp.month++;</

28、p><p>  temp.day=1;</p><p>  temp=temp+days;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p>

29、<b>  {</b></p><p>  temp.year++;</p><p>  temp.month=1;</p><p>  temp.day=1;</p><p>  days-=det+1;</p><p>  temp.leap=LeapYear(temp.year);</

30、p><p>  while(days>366)</p><p><b>  {</b></p><p>  temp.year++;</p><p>  days-=365+temp.leap;</p><p>  temp.leap=LeapYear(temp.year);</p>

31、<p><b>  }</b></p><p>  temp=temp+days;</p><p><b>  }</b></p><p>  return temp;</p><p><b>  }</b></p><p>  //日期N

32、天前的重載函數(shù)和日期N天后的重載函數(shù)類似</p><p>  //兩日期相加減重載函數(shù)</p><p>  long date::operator-(date &d)</p><p><b>  {</b></p><p>  long num=0;</p><p>  date A(-1

33、,-1,-1),B(-1,-1,-1);</p><p>  //先判斷兩個日期的大小再進行計算</p><p>  if(year==d.year)</p><p>  return num=fabs( SumDays(*this) - SumDays(d) );</p><p>  else if(year>d.year)</

34、p><p><b>  {</b></p><p><b>  A=*this;</b></p><p><b>  B=d;</b></p><p><b>  }</b></p><p><b>  else</b&

35、gt;</p><p><b>  {</b></p><p><b>  A=d;</b></p><p><b>  B=*this;</b></p><p><b>  }</b></p><p>  num+=SumDays

36、(A);</p><p><b>  A.year--;</b></p><p>  A.leap=LeapYear(A.year);</p><p>  A.month=12;</p><p><b>  A.day=31;</b></p><p>  while(A.ye

37、ar>B.year)</p><p><b>  {</b></p><p><b>  A.year--;</b></p><p>  num+=365+A.leap;</p><p>  A.leap=LeapYear(A.year);</p><p><b&

38、gt;  }</b></p><p><b>  num+=A-B;</b></p><p>  return num;</p><p><b>  }</b></p><p>  //此函數(shù)可以對輸入的日期是否正確進行判斷</p><p>  long date

39、::DateRule(long y,long m,long d)</p><p><b>  {</b></p><p>  if(LeapYear(y))</p><p><b>  {</b></p><p>  if( (m==1||m==3||m==5||m==7||m==8||m==10|

40、|m==12)&&d<32&&d>0</p><p>  || (m==4||m==6||m==9||m==11)&&d<31&&d>0 || m==2&&d>0&&d<30 )</p><p><b>  return 1;</b>&l

41、t;/p><p><b>  }</b></p><p>  else if( (m==1||m==3||m==5||m==7||m==8||m==10||m==12)&&d<32&&d>0</p><p>  || (m==4||m==6||m==9||m==11)&&d<31&a

42、mp;&d>0 || m==2&&d>0&&d<29 )</p><p><b>  return 0;</b></p><p>  return -1;</p><p><b>  }</b></p><p>  Qt GUI圖形界面設(shè)計&

43、lt;/p><p>  (1).基本控件設(shè)計:通過Qt的圖形設(shè)計工具Qt Design對窗口添加控件并進行編排,對于按鍵使用Qt特有的信號與槽函數(shù)控制相應(yīng)功能: </p><p> ?。?).Qt中的數(shù)據(jù)類型轉(zhuǎn)換:QString和int、char、char *的轉(zhuǎn)換。</p><p> ?。?).Qt圖形界面的圖形效果一:通過Qt Design 給窗口添加背景,空間背景

44、和顏色,以及提示文字內(nèi)容的字體和大小。</p><p> ?。?). Qt圖形界面的圖形效果二:</p><p>  通過代碼控制窗口的半透明setWindowOpacity(0.9);</p><p>  控件背景透明ui->label_time1_wrong->setAttribute(Qt::WA_TranslucentBackground,tru

45、e);</p><p>  運行時關(guān)于控件內(nèi)容的清除ui->label_time1_wrong->clear();</p><p> ?。?).設(shè)置程序圖標:在.pro項目文件中加入RC_FILE = DateManager.rc,對DateManager.rc文件加入內(nèi)容IDI_ICON1 ICON DISCARDABLE "time.ico",

46、其中time.ico為圖標文件。</p><p> ?。?).Qt程序的語言包:由于在Qt程序中使用中文會造成亂碼,故先用英文在代碼中實現(xiàn)功能再通過Qt的翻譯工具實現(xiàn)中文。</p><p>  在.pro項目文件中添加TRANSLATIONS += DateManager.ts,在Qt的命令提示窗口中輸入>lupdate *.pro便會生成翻譯文件DateManager.ts,對Da

47、teManager.ts內(nèi)容進行修改并再輸入> lrelease DateManager.ts –qm zh_CN.qm得到zh_CN.qm文件。</p><p>  在主函數(shù)中添加如下內(nèi)容便可實現(xiàn)Qt的漢化過程</p><p>  #include <QTranslator></p><p>  QTranslator translator;&l

48、t;/p><p>  translator.load("zh_CN",".");</p><p>  a.installTranslator(&translator);</p><p><b>  程序發(fā)布:</b></p><p>  (1).編譯靜態(tài)Qt-everywher

49、e的靜態(tài)庫用于靜態(tài)編譯</p><p>  (2).靜態(tài)編譯程序并附加語言包zh_CN.qm</p><p>  程序在其他環(huán)境下的測試:</p><p>  將程序至于虛擬機中windows xp_pro_sp3環(huán)境下,此環(huán)境尚除解壓軟件以外未安裝其他任何程序。得到如下效果,由于此環(huán)境下缺乏華文行楷字體,其字體與之前的顯示有點出入。</p><

50、p><b>  效果展示:</b></p><p><b>  問題討論與分析</b></p><p>  5.2想在源代碼中直接使用中文,而不使用tr()函數(shù)進行轉(zhuǎn)換,怎么辦?</p><p>  答:在main函數(shù)中加入下面三條語句,但并不提倡</p><p><b>  Quo

51、te:</b></p><p>  QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));</p><p>  QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));</p>

52、;<p>  QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));</p><p><b>  或者</b></p><p><b>  Quote:</b></p><p>  QTextCodec::setCodec

53、ForLocale(QTextCodec::codecForName("GBK"));</p><p>  QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));</p><p>  QTextCodec::setCodecForTr(QTextCodec::codecFor

54、Name("GBK"));</p><p>  使用GBK還是使用UTF-8,依源文件中漢字使用的內(nèi)碼而定</p><p>  這樣,就可在源文件中直接使用中文,比如:</p><p><b>  Quote:</b></p><p>  QMessageBox::information(NULL,

55、"信息", "關(guān)于本軟件的演示信息", QMessageBox::Ok, QMessageBox::NoButtons);</p><p>  5.2選擇Qt開發(fā)環(huán)境的原因:Qt開發(fā)環(huán)境雖然在Windows下的運行效率不如MFC高,同時靜態(tài)編譯所生成的可執(zhí)行文件會比MFC稍大。但是Qt平臺以它獨有的可跨平臺特點,可以僅修改少量代碼甚至不修改代碼通過改變編譯工具鏈編譯便可以

56、在Linux、MacOS等平臺運行,不僅可以在x86環(huán)境下編譯運行也可以交叉編譯在PDA設(shè)備上運行(如ARM等環(huán)境下),其可移植性是其他開發(fā)平臺所不能比擬的,同時Qt的信號與槽函數(shù)相對于MFC的同類功能相對來說更容易立即和使用。</p><p>  5.3日期計算的算法設(shè)計:由于閏年是是能被400整除的年份,或是能被4整除但不被100整除的年份。因而閏年不是每四年一次的,故每次對日期的計算時不能把每四年一次閏年

57、作為計算的簡便方式,必須對每一年是否閏年進行判斷,否則在日期的加減過程中將會出現(xiàn)錯誤。</p><p><b>  結(jié)束語</b></p><p>  本次課程設(shè)計,在QT Create 2.2的環(huán)境下編寫程序,由于之前從沒有學(xué)習(xí)過關(guān)于QT方面的知識,相比于以前的設(shè)計對我來說更具有挑戰(zhàn)性和吸引力,從同伴那里研究出課題后我自己就開始了解嵌入式和QT方面的知識,在自己的電

58、腦商安裝了虛擬機和LINUX開發(fā)環(huán)境。由于從來沒有接觸過前面花的時間很多,光是建立QT的調(diào)試環(huán)境就花了我很多時間,但是QT跟C++差不多,面向?qū)ο蟪绦蛟O(shè)計。編程的時候遇到的最大困難應(yīng)該是圖形界面的設(shè)計。QT所獨有的信號和與槽機制也是第一次接觸,剛開始理解的確很吃力。但這次設(shè)計總的來說對我很有意義,因為是剛接觸嵌入式編程對于這次設(shè)計自己把它視作一次挑戰(zhàn),自己查閱資料,自己解決問題,這樣的過程給了自己很大的成就感和信心。當(dāng)然這次課程設(shè)計也鍛

59、煉了自己分析實現(xiàn)方面的能力。在學(xué)習(xí)理論知識的同時也能夠自己動手去實現(xiàn),加深了自己對嵌入式的理解。</p><p>  此外,對于本次課程設(shè)計所遇到的問題,確實感到自己學(xué)習(xí)的理論知識和實踐能力的薄弱。在以后的學(xué)習(xí)方面還是需要加強自我學(xué)習(xí)能力和實踐能力。其中在考慮到日期計算過程中的閏年如何實現(xiàn)的問題,確實是除去QT圖形界面設(shè)計之外的最大問題。畢竟這是在這個小程序之中需要考慮到的主要問題之一。而圖形界面的設(shè)計確實是QT

60、較為核心的技術(shù)和特點之一,如何將圖形界面設(shè)計的比較人性化比較美觀也是一個值得研究的問題,不過已經(jīng)不是我們專業(yè)領(lǐng)域的問題了。另外,對于類分裝這類較為深入的知識,我也意識到了,自己還需要加強理解和運用。</p><p>  最后想說的是,本次的課程設(shè)計離不開各位同伴的鼎力支持,大家在一起討論在一起研究卻是很有意義,其中以龔秋棠同學(xué)最為出色。其專業(yè)方面的知識在很大程度上給我們鋪好了道路。也讓我們體會到了團隊合作的重要性

61、。</p><p>  總之本次課程設(shè)計,我確實收獲很多!</p><p><b>  參考文獻</b></p><p>  [1] Stanley B. Lippman, Josee Lajoie, Barbara E. Moo著.C++ Primer 中文版 [] .北京:人民郵電出版社,2006.6中文第四版</p><

62、;p>  [2] Jasmin Blanchette,Mark Summerfield著,閆、曾、張 譯.C++ GUI Programming With Qt4 [] .北京:電子工業(yè)出版社2008.8中文第二版</p><p>  [3] 劉汝佳.算法競賽入門經(jīng)典[].北京:清華大學(xué)出版社,2009.11第一版</p><p>  [4] 馬石安,魏文平.面向?qū)ο蟪绦蛟O(shè)計教程(C

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論