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

2022-02-27 08:03:18 字數 3546 閱讀 3340

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

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

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

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

具體來說,我先建了user類和task類,內容瞎寫,能想到什麼成員、函式先寫著,有乙個框架回頭慢慢加東西就行了。然後我們可以從跟使用者最貼近的介面開始做,依次繪製主介面、個人介面、任務詳情介面等等內容,當你在介面中寫下了乙個輸入框或者按鈕之類涉及跟後台的互動的控制項時,你就知道自己user類、task類裡需要記錄哪些資料,需要跟外界有什麼樣的互動。

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

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

寫在前面

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

基本上對於各種常用的控制項庫裡面都有提供,有任何需求的話可以直接在搜尋引擎中輸入「qt 按鈕」、「qt qpushbutton」,之類的進行學習,或者開乙個臨時檔案,在designer中設計之後觀察ui_****.h中它的相關**是怎麼寫出來的。如果足夠巨可以在vs中按ctrl點選乙個類的名稱檢視這個類的宣告,從中直接檢視相關方法。

關於如何在vs中輸出qt的除錯資訊,在專案->屬性->鏈結器->系統->子系統修改為下拉列表中的控制台(subsystem:console)即可,這樣一來我們直接printf,qdebug輸出的東西就會出現在控制台裡面了。

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

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

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

新建乙個類,命名為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資料夾下:

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

打算用乙個content類表示頁面的主要內容,之後由它來派生出index、tasklist、login之類具體介面的類,它就放在介面central widget,這部分沒什麼難度。

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

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

具體來說,這個index我的做法是在index下建乙個qvboxlayout,也就是豎直的布局,然後分別用qlabel和qtextbrowser實現標題和介紹,再add進layout裡,另外在add的時候額外加引數可以調整大小比例。

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

connect(訊號發出者, signal(訊號函式), 訊號接收者, slot(接收者槽函式));

訊號函式一般是內建好的,如triggered,clicked,需要時查一下即可。

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

實現了一下單擊menu中的元素就在status中showmessage,之後可以修改為頁面的切換。showmessage加字串可以在狀態列顯示這個字串,可以再加乙個整數表示顯示的毫秒時間。

主介面最終效果:

c 小學期大作業攻略(五)基於QSS的樣式美化

這回真的是最後一篇了。前面說過,我們開發過程中暫時不搭理樣式問題,等最後再一起處理,那麼現在就是最後處理時刻了!看到網上說qss跟css差不多,我還覺得自己可以幹回老本行了,結果用起來發現,qss是要啥啥沒有吧?不管怎麼說還是跌跌撞撞地假裝完成了美化。最新,估計也是最後版本的exe也上傳到了雲盤 開...

小學期鍊錶作業

include include include using namespace std class linknode class link linknode link create else cout 輸入資料 n cin data return phead void link list linkn...

小學期活動 二

距離上次寫在這裡寫小學期活動已經過去了乙個星期了,回顧下我在過去這個星期的所做的事情。這個星期裡,我主要做的是編寫參加資訊保安大賽的程式,其他的地方沒做多少。向量圖繪製軟體,我研究了svg的格式,使用xml解析器能夠很好的處理svg的檔案。找到了乙個很好的處理xml的類,tinyxml,我要使用這個...