天天看點

Qt之自定義界面(添加自定義标題欄)簡述效果自定義标題欄

通過上節内容,我們實作了自定義窗體的移動,但是我們缺少一個标題欄來顯示窗體的圖示、标題,以及控制窗體最小化、最大化、關閉的按鈕。

自定義标題欄後,所有的控件我們都可以定制,比如:在标題欄中添加換膚、設定按鈕以及其他控件。

<a href="#%e7%ae%80%e8%bf%b0">簡述</a>

<a href="#%e6%95%88%e6%9e%9c">效果</a>

<a href="#%e8%87%aa%e5%ae%9a%e4%b9%89%e6%a0%87%e9%a2%98%e6%a0%8f">自定義标題欄</a>

<a href="#%e5%ae%9e%e7%8e%b0">實作</a>

<a href="#%e6%8e%a5%e5%8f%a3%e8%af%b4%e6%98%8e">接口說明</a>

<a href="#%e4%bd%bf%e7%94%a8%e6%96%b9%e5%bc%8f">使用方式</a>

Qt之自定義界面(添加自定義标題欄)簡述效果自定義标題欄

title_bar.h

title_bar.cpp

mousepressevent

之前,我們将界面移動的事件寫在主界面裡面,這會有一個問題,一般情況下,是界面随着标題欄的移動而移動,而并非界面中的所有位置都可以進行拖動,是以我們将事件寫在标題欄中比較合理。

mousedoubleclickevent

輕按兩下标題欄會進行窗體的最大化/還原,是以我們需要重寫此事件進行控制。

eventfilter

事件過濾器,這裡被監聽的窗體為标題欄所在的窗體,是以當窗體标題、圖示等資訊發生改變時,标題欄也應該随之改變。

最好不要通過直接調用接口的形式來操作對應的行為,比如:titlebar中定義一個public函數來專門修改标題與圖示,這樣會造成不必要的麻煩,因為qt本身就是基于事件的,是以此處采用過濾器的方式。

updatemaximize

因為窗體大小發生變化的時候,最大化的圖示、提示應該對應的發生變化,是以在eventfilter中事件觸發時調用。

注意

installeventfilter必須在setwindowtitle、setwindowicon之前調用,因為必須先安裝事件過濾器,相應事件觸發時,才會進入标題欄的eventfilter事件中。