Qt之自建標題欄

2021-10-23 06:37:34 字數 4257 閱讀 8740

在專案中遇到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 ...