天天看點

學習QT之Qt::WindowFlags枚舉類型詳解

學習QT之Qt::WindowFlags枚舉類型詳解

在使用Qt設計的時候經常會看到QWidget空間的構造函數出現下面這樣一句話:

QWidget(QWidget *parent=0,Qt::WindowFlags f=0);      

QWidget *parent這段代碼容易了解,是指父視窗部件的指定。

Qt::windowFlags f=0這段代碼就有一點不解了,其實他是指定控件的視窗辨別的。值為0即Qt::Widget。

那麼就要好好說說控件的視窗辨別的設定了。視窗辨別由兩部分組成,分别是視窗類型和視窗提示hint,一個視窗隻有一個視窗類型。視窗提示定義了視窗的外觀,可以有多個提示,視窗提示進行按位取或即可。

要說清楚Qt::WindowFlags枚舉類型就必須清楚兩個概念:視窗和部件

視窗:相對獨立,有子視窗和父視窗之分,主要特點就是視窗有完整的邊框。

部件:必須依賴父視窗而存在,依賴性較強,出現在父窗體的界面内部。

有了上述的概念就好解釋Qt::WindowFlags枚舉類型的用法了。首先判斷一個控件是否是窗體,先根據參數parent的指定,要是值為0那麼就可以判斷其是一個視窗。否則需要根據Qt::WindowFlags枚舉類型的值才可以判斷其是否為視窗還是部件。

視窗類型 說明
Qt::Widget QWidget構造函數的預設值,如果新的視窗部件沒有父視窗部件,則它是一個獨立的視窗,否則就是一個子視窗部件。
Qt::Window 無論是否有父視窗部件,新視窗部件都是一個視窗,通常有一個視窗邊框和一個标題欄。
Qt::Dialog 新視窗部件是一個對話框,它是QDialog構造函數的預設值。
Qt::Sheet 新視窗部件是一個Macintosh表單(sheet)。
Qt::Drawer 新視窗部件是一個Macintosh抽屜(drawer)。
Qt::Popup 新視窗部件是一個彈出式頂層視窗。
Qt::Tool 新視窗部件是一個工具視窗,它通常是一個用于顯示工具按鈕的小視窗。如果一個工具視窗有父視窗部件,則它将顯示在父視窗部件的上面,否則,将相當于使用了Qt::WindowStayOnTopHint提示。
Qt::ToolTip 新視窗部件是一個提示視窗,沒有标題欄和視窗邊框。
Qt::SplashScreen 新視窗部件是一個歡迎視窗,它是QSplashScreen構造函數的預設值。
Qt::Desktop 新視窗部件是桌面,它是QDesktopWidget構造函數的預設值。
Qt::SubWindow 新視窗部件是一個子視窗,而無論該視窗部件是否有父視窗部件。
視窗提示 說明
Qt::MSWindowsFiredSizeDialogHint 為Windows系統上的視窗裝飾一個窄的對話框邊框,通常這個提示用于固定大小的對話框。
Qt::MSWindowsOwnDC 為Window系統上的視窗添加自身的顯示上下文菜單
Qt::X11BypassWindowManagerHint 完全忽視視窗管理器,它的作用是産生一個根本不被管理的無視窗邊框的視窗(此時,使用者無法使用鍵盤進行輸入,除非手動調用QWidget::activateWindow函數)。
Qt::FramelessWindowHint 産生一個無視窗邊框的視窗,此時使用者無法移動該視窗和改變它的大小。
Qt::CustomizeWindowHint 關閉預設的視窗标題提示。
Qt::WindowTitleHint 為視窗裝飾一個标題欄。
Qt::WindowSystemMenuHint 為視窗添加一個視窗系統菜單,并盡可能地添加一個關閉按鈕
Qt::WindowMinmizeButtonHint 為視窗添加一個"最小化"按鈕
Qt::WindowMaximizeButtonHint 為視窗添加一個"最大化"按鈕
Qt::WindowMinMaxButtonsHint 為視窗添加一個"最小化"按鈕和一個"最大化"按鈕。
Qt::WindowContextHelpButtonsHint 為視窗添加一個"上下文幫助"按鈕
Qt::WindowStaysOnTopHint 告知視窗系統,該視窗應該提留在所有其他視窗的上面。
Qt::WindowType_Mask 一個用于提取視窗辨別中的視窗類部分的掩碼。

注意:視窗提示僅對頂層視窗有效。

枚舉類型Qt::WindowFlags低位的1個位元組用于定于視窗部件的視窗類型,0x00000000~0x00000012共定義了11個視窗類型。Qt::WindowFlags的高位位元組定義了視窗提示,視窗提示能夠進行按位或操作,例如:​

​Qt::windowContextHelpButtonHint | Qt::windowMaximizeButtonHint​

放Qt::WindowFlags的視窗提示部分全部為0時,視窗提示不起作用。當有一個視窗提示被應用時,若要其他的視窗提示起作用,則必須使用位或操作(如果視窗系統支援這些視窗提示的話)。例如:

Qt::windowFlags flags = Qt::window;
widget->setWindowFlags(flags);      

widget視窗部件是一個視窗,它有一般視窗的外觀(有視窗邊框、标題欄、“最小化”按鈕、“最大化”按鈕和“關閉”按鈕等),此時視窗提示不起作用。例如:

flags |= Qt::WindowTitleHint;
widget->setWindowFlags(flags);      

上述代碼的執行将會使視窗體術發揮作用。在Windows系統中,widget視窗部件是一個視窗。它僅有标題欄,沒有“最小化”按鈕、“最大化”按鈕和“關閉”按鈕等。而X11視窗管理器忽略了視窗提示Qt::WindowTitleHint,例如,在紅旗Linux工作站和SUSE系統上,上述代碼并不起作用。

在Windows系統中,如果需要天劍一個"最小化"按鈕,則必須重新設定視窗部件的視窗辨別,具體如下:

flags |= Qt::WindowMinimizeButtonHint;
widget->setWindowFlags;      
flags &= Qt::WindowType_Mask;
widget->setWindowFlags(flags);      
this->setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
//如果想去掉某個屬性就直接加~就可以
this->setWindowFlags(windowFlags() & ~Qt::WindowMaximizeButtonHint);//去掉最大化按鈕      
//調用窗體時顯示在最前面
widget->show();
widget->activateWindow();
widget->setWindowState((m_pPlot_View->get_m_pOscilloscope_view()->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);

//保持窗體霸道的顯示在最前面
widget->setWindowFlags(widget->windowFlags() | Qt::WindowStaysOnTopHint);
widget->showNormal();

//隐藏工作列
widget->setWindowFlags(widget->windowFlags() | Qt::Tool);