很多時候,qt自帶的窗體邊框不能滿足我們的需求,或者我們覺得由於系統的主題影響導致介面太醜了,我們需要自行定義乙個好看並和普通標題欄功能相同的控制項去替代,以達到美化我們的程式介面的目的;本文簡單的實現了該功能。
下面是執行截圖,由於選的比較醜,所以看起來不好看:
實現了滑鼠拖拽事件,沒有為標題欄新增滑鼠右鍵事件以及其他美化功能,可以自行新增。
首先需要了解qt的一些函式的意義:
mouseevent中的globalpos()函式返回的是相對螢幕的位置座標,而pos()則是返回滑鼠在當前控制項(即捕獲該滑鼠事件的控制項)中的位置;
qwidget窗體的geometry().topleft()則返回的是當前窗體的左上角在螢幕中的位置;
其次讓我們看圖說話,理解下窗體移動:
然後我們每次只要把上次的位置作為起始位置,就是一次次的拖拽了。
最後,我們列出算式:
startpos = event->globalpos(); // 滑鼠的全域性初始位置,按下時記住
curwindowpos = geometry().topleft(); // 窗體的全域性位置,移動時
endpos = event->globalpos(); // 滑鼠按下發生移動之後的位置,移動時
move(curwindowpos+(startpos-endpos)); // 根據向量移動方向是初始位置減去末位置,移動時
startpos = endpos; // 將初始位置記為上次末位置,然後執行直到釋放拖拽,移動時
// windowheader.h
#ifndef windowheader_h
#define windowheader_h
#include
#include
#include
#include
#include
#include
// 自定義控制項,可拖拽標題欄
class
windowheader : public
qwidget
;#endif // windowheader_h
// windowheader.cpp
#include
"windowheader.h"
#include
#include
#include
parent)
// 設定應用logo
void windowheader::setskinimage(const char *path)
void windowheader::setsettingimage(const char *path)
void windowheader::setminiimage(const char *path)
void windowheader::setmaximage(const char *path)
void windowheader::setminimage(const char *path)
void windowheader::setcloseimage(const char *path)
// 重寫mousemoveevent
void windowheader::mousemoveevent(qmouseevent *event)
}// 重寫mousepressevent
void windowheader::mousepressevent(qmouseevent *event)
}// 重寫mousereleaseevent
void windowheader::mousereleaseevent(qmouseevent *event)
}
原文出處: 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 個性化標題欄,自定義標題欄
目前還沒有達到自己滿意的地步,魔方別人寫的的,先提供參考,後面在加入新的東西 標頭檔案 ifndef titlebar h define titlebar h include class qlabel class qpushbutton class titlebar public qwidget e...