Qt::WindowType、Qt::WidgetAttribute各个标志含义汇总
Qt::WindowType標志通過如下函數(shù)設置:
setWindowFlag 或 setWindowFlags注意:這兩個函數(shù)的區(qū)別是:不加s的每次只能設置一個Qt::WindowType標志位,加s的可以用 | 設置多個Qt::WindowType。具體參見QFlags的解釋。
匯總?cè)缦?#xff1a;
Qt::Widget:
這個很簡單,如果創(chuàng)建時,沒有父,則自己成為一個獨立的窗體,此時該窗體有標題欄;如果有父,則作為子窗體嵌入到父中,嵌入到父時,標題欄都不會存在了。
Qt::Window:
當窗體設置這個標志后,窗體不管是否有父窗體,都會有標題欄和邊框,不會嵌入到父窗體,如下代碼:
QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent): QWidget(parent) {ui.setupUi(this);setWindowTitle("parent");QWidget* p = new QWidget();p->setWindowTitle("windows");p->setWindowFlag(Qt::Window);p->show(); }窗體彈出如下:
將上面的QWidget* p = new QWidget();改為QWidget* p = new QWidget(this);即將this作為其父,依然是彈出上面的窗體。
Qt::Dialog:
等同于創(chuàng)建一個QDialog的窗體。
Qt::Sheet:
這個標志貌似只在mac系統(tǒng)下起作用,Windows下試了沒啥效果,等同于設置窗體為模態(tài)窗體。Qt官方文檔建議用QWidget::setWindowModality(), or QDialog::open(),函數(shù)設置,而不建議用該標志。
Qt::Drawer:
是Qt::Sheet 和 Qt::Dialog的組合,等同于Qt::Sheet | Qt::Dialog,只在mac系統(tǒng)下起作用,Windows系統(tǒng)不起作用。
Qt::Popup
按Qt文檔的解釋是彈出式的頂層模態(tài)窗體,有邊框,但是如下代碼:
#include "QtWidgetsApplication1.h" #include "QtTestWidget.h" QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent): QWidget(parent) {ui.setupUi(this);setWindowTitle("parent");QtTestWidget* p = new QtTestWidget();p->setWindowTitle("windows");setWindowFlag(Qt::Popup);p->show();}卻出現(xiàn)如下現(xiàn)象:
設置過Qt::Popup標志的窗體最頂層,沒有邊框,且鼠標一直轉(zhuǎn)圈等待狀態(tài),單擊其它窗體后,Qt::Popup標志的窗體消失不見了,原因不知道。
Qt::Tool:
該標志指示該窗體是一個工具窗口。工具窗體比普通一般窗體的標題欄小,且有時有些其它的裝飾。它的典型用途是用來做工具欄。如果設置該標志的窗體有父窗體,則該標志的窗體一直在其父的上面,即置頂;如果沒有父,你應該考慮為該窗體設置Qt::WindowStaysOnTopHint屬性,你也可以組合Qt::FramelessWindowHint標志使用。
Qt::ToolTip:
指示包含該標志的窗體用于工具欄提示,如下代碼:
#include "QtWidgetsApplication1.h" #include "QtTestWidget.h" QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent): QWidget(parent) {ui.setupUi(this);setWindowTitle("parent");QtTestWidget* p = new QtTestWidget(this);p->setWindowTitle("windows");p->setWindowFlag(Qt::ToolTip); // 設置p窗體為工具欄提示p->show();}可以看到設置該標志后,窗體標題欄、邊框都沒有了
Qt::SplashScreen:
指示該窗體用作閃屏。閃屏是有些軟件在主窗體彈出之前,經(jīng)常會用一個無邊框的小窗口彈出一些提示信息,如:加載組件或庫的進度、產(chǎn)品信息等信息,之后該閃屏窗體小時,主程序界面顯示出來。
Qt::Desktop:
指示該窗體是一個Desktop類型的窗體,它是一個QDesktopWidget類型的窗體。如下代碼:
#include "QtWidgetsApplication1.h" #include "QtTestWidget.h" #include<QDeskTopWidget> QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent): QWidget(parent) {ui.setupUi(this);setWindowTitle("parent");QtTestWidget* p = new QtTestWidget();p->setWindowTitle("windows");p->setWindowFlags(Qt::Desktop);p->show();}則p表示的QtTestWidget不可見了。
Qt::SubWindow:
指示該窗體是一個子窗體,類似Qt的QMdiSubWindow窗體。
----------------------------------------------------------------------------------------------------------------
Qt::WidgetAttribute枚舉屬性用setAttribute函數(shù)設置,當該函數(shù)的第二個參數(shù)設置為true時,則設置該屬性;當該函數(shù)的第二個參數(shù)設置為false,表示移除關閉該屬性。下面分類說明:
Qt::WA_AcceptDrops:
窗體接受拖放,等同于調(diào)用QWidget::setAcceptDrops函數(shù)。
Qt::WA_AlwaysShowToolTips:
窗體一直顯示工具欄提示。默認情況下,當為窗體設置了工具欄提示時,只有在該窗體具有焦點且鼠標移動到該窗體時才會顯示工具欄提示。當窗體沒有獲取到焦點時,鼠標移動到其上面時不會顯示工具欄提示,當設置該屬性true時,即使窗體沒有獲取焦點,鼠標移動到其上面時,依然會顯示工具欄提示。如下:
#include "QtWidgetsApplication1.h" #include "QtTestWidget.h" #include<QDeskTopWidget> QtWidgetsApplication1::QtWidgetsApplication1(QWidget* parent): QWidget(parent) {ui.setupUi(this);setWindowTitle("parent");QtTestWidget* p = new QtTestWidget();p->setWindowTitle("windows");p->setToolTip("QtTestWidget");p->setAttribute(Qt::WA_AlwaysShowToolTips);p->show();}彈出如下:
?右側(cè)parent窗體是當前具有焦點的窗體,左側(cè)Windows窗體沒有焦點,此時鼠標移動到左側(cè)窗體,依然顯示了工具欄提示。
Qt::WA_CustomWhatsThis
按照Qt官方的解釋是:是否開啟whatthis提示,但是通過如下代碼關掉Whatthis提示,但Whatthis依然有:
#include "QtWidgetsApplication1.h" #include "QtTestWidget.h" #include<QDeskTopWidget> QtWidgetsApplication1::QtWidgetsApplication1(QWidget* parent): QWidget(parent) {ui.setupUi(this);setWindowTitle("parent");QtTestWidget* p = new QtTestWidget();p->setWindowTitle("windows");;p->setWhatsThis(tr("Click this option to create a new file."));p->setAttribute(Qt::WA_CustomWhatsThis, false);bool b = p->testAttribute(Qt::WA_CustomWhatsThis);p->show();}同時按住shift、F1鍵,依然彈出了如下whatthis提示,原因不知道
?Qt::WA_DeleteOnClose
設置這個標志的窗體當窗體關閉事件closeEvent()發(fā)生時,會自動由Qt來刪除該窗體對象,不用人為刪除。注意:如果設置了該標志的窗體人為刪除會導致崩潰,如下:
QtWidgetsApplication1::QtWidgetsApplication1(QWidget* parent): QWidget(parent) {ui.setupUi(this);setWindowTitle("parent");p = new QtTestWidget(); // p為在.h文件中定義的成員變量p->setWindowTitle("windows");;p->setAttribute(Qt::WA_DeleteOnClose);p->show();}QtWidgetsApplication1::~QtWidgetsApplication1() {if (p != nullptr){delete p; // qt已經(jīng)刪除過p,不需要再delete了,如果再delete一次,此處會奔潰} }這種方法有個弊端:因為這個指針Qt是沒有辦法自動設為nullptr,會變?yōu)橐爸羔?/strong>,這也是上面人為刪除崩潰的原因。
Qt::WA_Disabled
當窗體該標志為true后,窗體的keyPressEvent、keyReleaseEvent、mouseReleaseEvent(), mouseDoubleClickEvent(), mouseMoveEvents事件都不會觸發(fā)、不會響應;注意:窗體上的部件如按鈕、編輯框的單擊、輸入等依然有效。當窗體上的小部件如按鈕、編輯框等的該標志設置為true后,小部件為禁用狀態(tài),相當于調(diào)用setDisabled(true),按鈕、編輯框的單擊、輸入等依然無效
Qt::WA_DontShowOnScreen
這個標志指示窗體隱藏或不是桌面可見區(qū)域的一部分。相當于對窗體調(diào)用hide()或setVisible(false)函數(shù)
Qt::WA_Hover
設置這個標志true后,每當鼠標進入窗體或離開窗體都會發(fā)送paint events事件,即如果窗體重寫了paintEvent,則paintEvent會被調(diào)用。
Qt::WA_InputMethodEnabled
設置這個標志為true后,則開啟亞洲輸入法事件,Qwidget的QInputMethodEvent事件就會觸發(fā)。例如:在一個密碼框中禁止輸入中文、日文、韓文等亞洲文字作為密碼,這種情況一般我們會重寫QLineEdit,但是過于復雜,下面通過設置編輯框的Qt::WA_InputMethodEnabled一句代碼搞定:
Qt::WA_MouseTracking
設置為true后,等同調(diào)用setMouseTracking(true)
Qt::WA_OpaquePaintEvent
這個標志的解釋,請參見《Qt::WA_OpaquePaintEvent理解》
Qt::WA_NoMousePropagation
這個標志的解釋,請參見《Qt::WA_NoMousePropagation用法》
Qt::WA_QuitOnClose
這個標志的解釋,請參見《Qt::WA_QuitOnClose用法》
Qt::WA_Resized
這個標志默認為true,當設置為false后,窗體在改變大小時,不會發(fā)送QResizeEvent事件,即resizeEvent(QResizeEvent* event)函數(shù)不會進入、不會響應,但按住鼠標能改變窗體大小。
Qt::WA_StaticContents
請參見Qt自帶的例子scribble,該工程在Qt安裝目錄下的Examples\Qt-5.14.1\widgets\widgetsscribble????? 目錄,官方對該例子的文檔說明參見:Scribble Example | Qt Widgets 5.15.7
Qt::WA_ShowWithoutActivating
設置該標志為true后,以非激活模式顯示窗體。即窗體顯示出來后,但不具備焦點,即鍵盤事件發(fā)生時,該窗體不會收到;鍵盤事件不發(fā)到該窗體上。
Qt::WA_AcceptTouchEvents
設置該標志為true后,允許觸摸事件(?QTouchEvent)發(fā)送到該窗體。在所有能處理觸摸事件的窗體上都要將該屬性設置為true,如果不設置為true,則將所有的觸摸事件當為鼠標事件來處理。
Qt::WA_TabletTracking
相當于調(diào)用setTabletTracking,至于什么是Tablet?? Tracking 請參見《Qt Designer中部件的tabletTracking和mouseTracking屬性》
總結(jié)
以上是生活随笔為你收集整理的Qt::WindowType、Qt::WidgetAttribute各个标志含义汇总的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果为 Apple Watch Ultr
- 下一篇: Qt的json对象不具备类似指针、引用的