最近一直在忙,忙工作,忙私活;也很久沒有寫博客了;
今天主要談談Qt UI界面統一樣式(格式基調)的問題;例如在window系統上,幾乎所有的窗口都有標題欄和狀態欄以及中央部件,而且每一個標題欄和狀態欄以及中央部件樣式都保持一致的;但是在實際開發中我們又不想使用window系統自帶的標題欄和狀態欄等,因此需要自定義標題欄和狀態欄以及中央部件,同時保持項目中的所有窗口的標題欄和狀態欄和中央部件的格式樣式一致,這樣在項目開發中,既可以保持擁有漂亮的UI界面,又能大大的提高開發效率,因為你不需要在每一個窗口中對標題欄和狀態欄以及中央部件進行重復開發了,例如不需要對每一個窗口進行鼠標移動判斷從而對窗口進行移動,使用戶更加專注於業務;下面談談具體怎樣實現:
一、將標題欄和狀態欄以及中央部件集成於一個類中
單獨作為一個類,提供標題欄和狀態欄以及中央部件指針成員;
class QBaseWidget : public QFrame { QVBoxLayout *m_pMainLayout; //主布局 QTitleBar *m_pTitleBar; //標題欄 QWidget *m_pContentWidget; //內容區域,中央部件 QStatuBar *m_pStatuBar; //狀態欄 }
代碼如上所示,當然QTitleBar和QStatuBar都是自定義的類,需要自己處理,如增加最小化按鈕,最大化按鈕按鈕,關閉按鈕,鼠標位置判斷以及窗口多動,這樣你可以做成你自己想要的任何標題欄和狀態欄以及中央部件,m_pContentWidget成員變量只是保持一個指針而已,以后如果你要把你做的內容窗口嵌入到該類中,只是賦值即可,m_pMainLayout就是類的主布局了;寫到這里,大家覺得是不是有點像QMainWindow類的處理過程了;
二、為標題欄和狀態欄提供修改接口
在有些窗口中,可能不需要狀態欄,例如程序的關於對話框,因此這時就應該提供外部接口供調用者使用,表示標題欄和狀態按是否需要;
QBaseWidget(bool bShowTitleBar,QWidget *pContentWidget,bool bShowStatuBar,QWidget *parent = 0);
三、為標題欄按鈕提供修改接口
並不是所有的窗口都有最大化和最小化以及關閉按鈕,例如對話框窗口,就只有關閉按鈕了,那么最小化以及最大化按鈕當然就不要了;所以需要提供外部接口給調用者使用:
void setWidgetBtnShow(bool bMinBtnShow,bool bMaxBtnShow,bool bCloseBtnShow);
參數的含義依次表示是否顯示最小化按鈕,是否顯示最大化按鈕,是否顯示關閉按鈕.
四、將自己的內容部件嵌入到QBaseWidget中
上述只是講解了怎么修改自己的外觀;當然,最主要的還是要把自己的內容部件潛入到其中,例如你在Qt Designer中設計了一個窗口,你想把這個窗口套在其中,則:
QBaseWidget(bool bShowTitleBar,QWidget *pContentWidget,bool bShowStatuBar,QWidget *parent = 0);
只要將自己設計的內容部件的指針賦值給pContentWidget即可,這樣就自然套上了統一的標題欄和狀態欄以及中央部件樣式.
五、統一外觀設置
在整個項目中,當然希望所有的窗口界面的色彩格調保持一致了,這時只要美化上述中所述的標題欄,狀態欄以及中央部件即可,而且只要寫一處代碼即可哦.
六、程序示例
最后,給大家截圖看看實現效果,統一格式的標題欄,狀態欄以及中央部件的格式;由於工程是用於實際項目中,所以這里只截取了用戶登錄對話框以及關於對話框界面,其他界面不提供,謝謝
七、界面設計
用戶只需要設計中央部件即可,其他的就不要了,如上圖中的用戶登錄對話框,用戶只需要在Qt Designer中設計用戶登錄對話框即可,然后嵌入其中即可,如下圖所示:
八、優勢
1、統一的樣式格調
2、漂亮的UI界面
3、大大節省開發時間