學習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);