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