c++小學期大作業攻略(二)整體思路+主界面


  寫在前面:如果我曾經說過要在第一周之內寫完大作業,那……肯定是你聽錯了。不過如果我在寫的時候有攻略看的話應該可以輕松地在4~5天內做完,然后覺得寫攻略的人是個小天使吧(瘋狂暗示)。出於給大家自由發揮的考慮,本文略去了很多細節,如果按照本攻略行進過程中遇到任何問題請盡可能告知我,一來相互提供新的思路,二來能幫助我完善攻略。

  因為擔心今天不寫出來的話明天可能會忘(其實是擔心托更太久沒人願意看),雖然搬宿舍弄得比較晚還是先稍微來寫點東西。(最后結果是寫這段話之后又拖了一天

  這個二感覺有點划水,只是介紹一下我寫代碼的工作打算從哪里展開。咦這兩天我就想出來這個,我到底在干什么啊。

 

1. 畫餅

  大佬們貌似寫代碼之前會把整個代碼的框架整理出來,這種整體先思考好的做法應該是非常值得提倡的,但是,對於我們這種連起步怎么做都沒有思路的小白來說是非常困難的吧。因此,我的建議是先把能想出來要建的類寫一寫,數據、函數能想到多少找多少,然后找一條線索往下做,在做的過程中慢慢豐富之前寫的類

  具體來說,我先建了User類和Task類,內容瞎寫,能想到什么成員、函數先寫着,有一個框架回頭慢慢加東西就行了。然后我們可以從跟用戶最貼近的界面開始做,依次繪制主界面、個人界面、任務詳情界面等等內容,當你在界面中寫下了一個輸入框或者按鈕之類涉及跟后台的交互的控件時,你就知道自己User類、Task類里需要記錄哪些數據,需要跟外界有什么樣的交互。

  

 

 

  之后所有與Qt相關的內容我都是現學現賣,結構也感覺非常亂,如果有不正確的地方求輕噴指正。

  我單獨開了一篇隨筆更新我當前的代碼結構,如果你想被劇透(或者大作業做不完了)可以稍微參考一下:

  https://www.cnblogs.com/Enceladus/p/11216384.html

 

2. 主界面

  把主界面單獨拿出來作為一個范例讓大家知道整個具體的開發過程是什么樣的,后面其他界面估計都會一筆帶過。

  

 

  寫在前面

    對Qt框架的一些理解:Qt的主要結構大約是樹狀的,你可以把界面進行划分,比如說我窗口分為上下兩半,分別用另一個對象(一般是用QWidget)來填充這個區域,每個區域中又可以放入按鈕、文本框之類的控件。這兩個對象就是這個窗口的子元素,具體的小控件又是這兩個對象的子元素。通過這樣一層一層地划分和填充,最終堆砌起來整個畫面。

    基本上對於各種常用的控件庫里面都有提供,有任何需求的話可以直接在搜索引擎中輸入“Qt 按鈕”、“Qt QPushButton”,之類的進行學習,或者開一個臨時文件,在Designer中設計之后觀察ui_****.h中它的相關代碼是怎么寫出來的。如果足夠巨可以在VS中按Ctrl點擊一個類的名稱查看這個類的聲明,從中直接查看相關方法。

    關於如何在VS中輸出Qt的調試信息,在項目->屬性->鏈接器->系統->子系統修改為下拉菜單中的控制台(SUBSYSTEM:CONSOLE)即可,這樣一來我們直接printf,qDebug輸出的東西就會出現在控制台里面了。

    另外,我們暫時不考慮美觀方面的問題,等造出來一個能work的版本再來統一進行美化。

 

  由於在我自己的電腦上Qt Designer設計出來的效果總是跟實際有區別(也許是我不會用),所以這里使用的主要是純代碼編輯來描繪窗口,當然不排除以后可能用Designer進行輔助。

 

 

  首先我們新建一個Qt GUI Application項目作為我們此次大作業的最終項目,建完會發現VS已經幫你建立好了一個QMainWindow從繼承過來的類。

  來了解一下這個QMainWindow,它是基礎布局元素QWidget的一個派生,它已經預設好了一個布局(如圖,圖片來自網絡),里面有菜單欄、工具欄、狀態欄、主畫面等等,我們的思路是所有頁面都直接以此為基礎,僅僅改變主界面中的內容即可。

  

 

 

  a. Menu

  新建一個類,命名為Menu,從QMenuBar那里繼承過來。不使用原生的QMenuBar是因為我們可能需要給它加一些行為,甚至多一些數據成員,如果真有需要那時會方便一些。(其實是想強行體現繼承關系

  在VS中加類有很方便的操作,直接在項目下拉菜單中找到Add Qt Class,類型我暫時都選了GUI,這樣以后如果想通過UI設計布局會方便一些。后面唯一需要修改的設置是把Base Class設置為QMenuBar。

  

  之后可以直接用QMenuBar的addAction("A")函數在菜單欄中添加一個文字為A的元素,因為我們的Menu類是從QmenuBar繼承過來的所以它也有相應的函數。

  如果你希望這個元素擁有更加豐富的屬性,比如自定義樣式或者交互函數,可以new一個QAction出來,然后自己進行設定,再add進去。

  如果你還希望這個菜單欄擁有下拉菜單,下拉菜單還有有再一層展開的菜單,可以用QMenu類,new QMenu之后addAction就跟前面一樣是直接加一個元素,addMenu函數就可以將另一個QMenu類型的元素加進去變成多層菜單。

  MainWindow中有一個setMenuBar的函數,可以將一個QMenuBar型的函數加進我們的主界面里,樣式方面都幫我們預設好了(一開始我還想着把窗口當成一個畫布瘋狂手繪-_-||)。

  這里是一份測試代碼,完整的VS工程文件已經放在網盤的example文件夾下:

    https://cloud.tsinghua.edu.cn/d/059ef6b1f9a149ce879b/files/?p=/example/Menu.rar

  大家可以自行嘗試,代碼中有涉及信號與槽,以后我們會講(我自己現在也沒弄明白= =)。

  

  

   b. Content、Index

  打算用一個Content類表示頁面的主要內容,之后由它來派生出Index、TaskList、LogIn之類具體界面的類,它就放在界面Central Widget,這部分沒什么難度。

  我們需要關心的是界面的具體設計,現在我們需要設計的是主頁(叫Index是造網站留下來的習慣)。在已經有Menu的情況下,主頁的設計相對簡單,擺一個大大的標題出來,寫點簡介即可(嘛,反正我造網站的時候是這么做的,順路打個廣告:www.enceladus.cf)。

  寫index時遇到的一個坑:元素只有在show()之后才能獲得正確的width()和height()。一開始我把index設置成centralWidget,然后放在里面的Label設置大小的時候設置為這個index的寬,也就是充滿畫面,掙扎了很久發現獲得的寬並不是正確的寬。

  所以我建議在考慮樣式相關內容的時候還是盡可能用qss來進行設置。另外遇事不決加layout,這的確是一個非常重要的布局工具。

  具體來說,這個index我的做法是在index下建一個QVBoxLayout,也就是豎直的布局,然后分別用QLabel和QTextBrowser實現標題和介紹,再add進layout里,另外在add的時候額外加參數可以調整大小比例。

  c. Status

  具體如何在程序中加入QStatusBar就不說了,跟前面基本上是一樣的。

  connect(信號發出者, SIGNAL(信號函數), 信號接收者, SLOT(接收者槽函數));

  信號函數一般是內置好的,如triggered,clicked,需要時查一下即可。

  槽函數是信號接收者類中的函數,自己定義,想干什么都可以。因此如果信號發出者和接受者是父子元素關系的話,一般我們會把這個connect放在父親那里,因為父親可以很容易得到指向兒子的指針,兒子卻比較難拿到指向父親的,不是父子關系可能需要放在它們的lca(最近公共祖先)那里?

  實現了一下單擊Menu中的元素就在Status中showMessage,之后可以修改為頁面的切換。showMessage加字符串可以在狀態欄顯示這個字符串,可以再加一個整數表示顯示的毫秒時間。

  主界面最終效果:

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM