Qt實現自定義標題頭

2021-10-12 10:06:14 字數 3208 閱讀 3872

在很多時候都需要自定義標題頭的樣式。在qt裡面。如果去掉了系統自帶的標題頭。那麼很多屬性也就會消失。例如沒法拖拽窗體。沒法通過滑鼠拉伸窗體。

新增乙個水平布局。裡面分別有兩個qlabel以及三個qpushbutton。兩個qlabel用來顯示圖示和窗體標題。三個qpushbutton分別對應著隱藏。最大化以及關閉按鈕。

然後滑鼠在靠近窗體的邊緣的時候需要更改滑鼠游標的形狀。且可以拉伸窗體。同時滑鼠按在標題上可以進行拖拽。此標題頭內部維護了qwidget* _ownerwidget.其實就是這個標題頭的擁有窗體。然後通過事件過濾器eventfilter來監測滑鼠事件等事件。

實現**

void

fcustomtitlewidget

::setupconnection()

void

fcustomtitlewidget

::initui()

void

fcustomtitlewidget

::setownerwidget

(qwidget * target)

//設定擁有窗體

_ownerwidget = target;

_ownerwidget->

setattribute

(qt::wa_hover)

;//hover屬性

_ownerwidget->

installeventfilter

(this);

//安裝事件過濾器

}}

在滑鼠按下的時候。記錄下滑鼠按下的位置。然後在滑鼠拖拽移動的時候記錄下和上一次位置的差值。然後更改窗體的位置即可。

實現**

case qevent::mousebuttonpress:

}break

;case qevent::mousemove:

}break

;

設定**_ownerwidget的屬性_ownerwidget->setattribute(qt::wa_hover);可以檢測到滑鼠懸浮移動事件。然後判斷滑鼠在_ownerwidget**的位置。若是在四周就根據所在的方向更改滑鼠游標形狀。

實現**

qt::cursorshape fcustomtitlewidget

::getcursorshapebydragdir

(dragdir dir)

break

;case dragdirleftup:

case dragdirrightbottom:

break

;case dragdirup:

case dragdirbottom:

break

;case dragdirrightup:

case dragdirleftbottom:

break

;case dragdirleft:

case dragdirright:

break

;default

:break;}

return shape;

}

首先根據滑鼠拖拽的方向來確定如何更改窗體的位置或者大小。如果滑鼠沒有在四周,但是是在此標題頭中。那麼就是移動窗體的位置。如果在四周。就需要更改窗體的位置以及大小。由於筆者沒有gif製作工具。就不貼效果圖了。具體的效果可以看看visual studio。將滑鼠放在visual studio的四周。可以發現游標發生改變。若是按在上面的標題頭,拖拽可以改變位置。若是在四周拖拽。可以拉伸改變窗體的位置。

實現**

void

fcustomtitlewidget

::updatewidgetsizebydragdir

(dragdir dragdir,

const qpoint &mousepos)

auto widgetgeometry = _ownerwidget->

geometry()

;switch

(dragdir)

break

;case dragdirleftup:

break

;case dragdirrightbottom:

break

;case dragdirup:

break

;case dragdirbottom:

break

;case dragdirrightup:

break

;case dragdirleftbottom:

break

;case dragdirleft:

break

;case dragdirright:

break

;default

:break;}

}

#

include

"fcustomtitlewidget.h"

//自定義標題頭

#include

#include

class

testtitlewidget

:public

qwidget

~testtitlewidget()

private

: qvboxlayout *_layout;

qtablewidget *_tablewidget;

fcustomtitlewidget* _titlewidget;};

intmain

(int argc,

char

*ar**)

因為很多人上github的網速都很慢。所以就將**託管在了gitee上面。

注意

**不是乙個完整的工程。只有.**件以及.cpp檔案。檔名是fcustomtitlewidget.hfcustomtitlewidget.cpp

git位址

**在fcustomtitlewidget 目錄中

QT 自定義標題欄

1 去除舊的標題欄 去除qdialog對話方塊有上角問號 qt windowflags flags qt dialog flags qt windowclosebuttonhint flags qt framelesswindowhint setwindowflags flags flags qt ...

QT自定義標題欄

ifndef dlgtitle h define dlgtitle h include enum buttontype class dlgtitle public qwidget endif dlgtitle h自定義標題欄類dlgtitle.cpp如下 include dlgtitle.h def...

Qt自定義標題欄並實現拖拽

很多時候,qt自帶的窗體邊框不能滿足我們的需求,或者我們覺得由於系統的主題影響導致介面太醜了,我們需要自行定義乙個好看並和普通標題欄功能相同的控制項去替代,以達到美化我們的程式介面的目的 本文簡單的實現了該功能。下面是執行截圖,由於選的比較醜,所以看起來不好看 實現了滑鼠拖拽事件,沒有為標題欄新增滑...