在專案中遇到linux環境重dialog在雙擊標題欄時對話方塊會最大化的情況,
在設定maxmiumsize等都沒有效果的情況下所以自設標題欄。
大體思路是通過三個空間組成標題欄的圖示、標題、關閉按鍵,
並且通過滑鼠事件來控制框體的移動。
通過繼承qdialog,將標題欄和將所要顯示的內容的widget組合起來,
通過getcurchildwidget()介面將widget介面暴露出來供後續填充自己想要的widget,
這樣便可以將專案中需要使用dialog的部件統一風格。
// titilebar.h
#ifndef __titlebar_h_
#define __titlebar_h_
#include
class
qevent
;class
qmouseevent
;class
qpixmap
;class
qcolor
;class
qlabel
;class
qpushbutton
;class
qpoint
;class
qstring
;class
titlebar
:public qwidget
;#endif
// titlebar.cpp
#include
"titlebar.h"
#include
#include
#include
#include
#include
#include
#include
#include
"cstaticdatas.h"
// 主要是獲取控制項解析度的一些函式
titlebar::
titlebar
(qwidget* parent,qt::windowflags flags)
:isleftmousepressed
(false);"
);windowtitlelab =
newqlabel
(this);
windowtitlelab-
>
setobjectname
("windowtitlelab");
windowtitlelab-
>
setpixmap
(qpixmap(20
,20))
; windowtitlelab-
>
setsizepolicy
(qsizepolicy::expanding,qsizepolicy::fixed)
; qstring strwindowtitle =
"qlabel#windowtitlelab;"
; windowtitlelab-
>
setstylesheet
(strwindowtitle)
; closebtn =
newqpushbutton
(this);
closebtn-
>
seticon
(qicon
(":/subicon/sbuicon/close.png"))
; closebtn-
>
setfixedsize(20
,20);
closebtn-
>
setobjectname
("closebtn");
closebtn-
>
setstylesheet
("qpushbutton#closebtn");
qhboxlayout* titlelayout =
new qhboxlayout;
titlelayout-
>
addwidget
(titleiconlab,
0,qt::alignleft)
; titlelayout-
>
addwidget
(windowtitlelab,
0,qt::aligncenter)
; titlelayout-
>
addwidget
(closebtn,
0,qt::alignright)
; titlelayout-
>
setcontentsmargins(2
,0,2
,0);
connect
(closebtn,
signal
(clicked()
),this
,slot
(on_closebtn_pressed()
));setlayout
(titlelayout);}
titlebar::
~titlebar()
void titlebar::
setwindowtitle
(qstring& strtitle)
void titlebar::
setwindowicon
(qpixmap& pixtitle)
void titlebar::
mousepressevent
(qmouseevent*event)
}void titlebar::
mousemoveevent
(qmouseevent* event)
}void titlebar::
mousereleaseevent
(qmouseevent* event)
}void titlebar::
on_closebtn_pressed()
qcolor titlebar::
gettitlecolor()
void titlebar::
settitlecolor
(qcolor& col)
// dis_dialog.h
#ifndef _dis_dialog_h__
#define _dis_dialog_h__
#include
#include
#include
"titlebar.h"
class
qwidget
;class
qvboxlayout
;class
dialog
:public qdialog
;#endif
//dis_dialog.h
// dis_dialog.cpp
#include
#include
#include
#include
#include
#include
#include
/// 對話方塊建構函式
dialog::
dialog
(qwidget *parent, qt::wflags flags)
dialog::
~dialog()
/// 設定標題欄的文字
void dialog::
setwindowtitle
(qstring& title)
/// 設定標題欄的圖示
void dialog::
setwindowicon
(qpixmap& pixtitle)
/// 返回對話方塊的widget
qwidget* dialog::
getcurchildwidget()
/// 獲取標題欄顏色
qcolor dialog::
gettitlecolor()
/// 設定標題欄顏色
bool dialog::
settitlecolor
(qcolor& col)
void dialog::
setdlglayoutstretch
(int titleba***ctor,
int contentfactor)
最後,**和思路上參考如下博文: QT 去掉標題欄和去掉標題欄後移動視窗
在用qt編寫介面時,去掉標題欄方法比較簡單,就一行 this setwindowflags qt framelesswindowhint 去掉以後又發現乙個問題,就是不能移動視窗了,於是我就重寫了三個滑鼠事件,大致 如下 h檔案的 include protected void mousepresse...
Qt 個性化標題欄,自定義標題欄
目前還沒有達到自己滿意的地步,魔方別人寫的的,先提供參考,後面在加入新的東西 標頭檔案 ifndef titlebar h define titlebar h include class qlabel class qpushbutton class titlebar public qwidget e...
QT 自定義標題欄
1 去除舊的標題欄 去除qdialog對話方塊有上角問號 qt windowflags flags qt dialog flags qt windowclosebuttonhint flags qt framelesswindowhint setwindowflags flags flags qt ...