Qt::WindowType、Qt::WidgetAttribute各个标志含义汇总

目录

0. 前言

1. Qt::Widget

2. Qt::Window

3. Qt::Dialog:

4. Qt::Sheet   

5. Qt::Drawer

6. Qt::Popup

7. Qt::Tool

8. Qt::ToolTip

9. Qt::SplashScreen

10. Qt::Desktop

11. Qt::SubWindow

12. Qt::WA_AcceptDrops

13. Qt::WA_AlwaysShowToolTips

14. Qt::WA_CustomWhatsThis

 16. Qt::WA_DeleteOnClose

17. Qt::WA_Disabled

18. Qt::WA_DontShowOnScreen

19. Qt::WA_Hover

20. Qt::WA_InputMethodEnabled

21. Qt::WA_MouseTracking

22. Qt::WA_OpaquePaintEvent

23. Qt::WA_NoMousePropagation

24. Qt::WA_QuitOnClose

25. Qt::WA_Resized

26. Qt::WA_StaticContents

29. Qt::WA_ShowWithoutActivating

30. Qt::WA_AcceptTouchEvents

31. Qt::WA_TabletTracking


0. 前言

        Qt中有Qt::WindowType、Qt::WidgetAttribute属性和Qt::ApplicationAttribute 属性。Qt::ApplicationAttribute 属性是指程序级别属性,即设置后,该QApplication、QCoreApplication、QGuiApplication代表的整个进程下的所有属性都被改变,而Qt::WidgetAttribute则仅仅对指定的QWidget窗体属性改变。关于Qt::ApplicationAttribute枚举的含义,请参考

《Qt::ApplicationAttribute各枚举值含义》博文。

Qt::WindowType标志通过如下函数设置:

setWindowFlag
或
setWindowFlags

注意:这两个函数的区别是:不加s的每次只能设置一个Qt::WindowType标志位,加s的可以用 | 设置多个Qt::WindowType。具体参见QFlags的解释。

1. Qt::Widget

       这个很简单,如果创建时,没有父,则自己成为一个独立的窗体,此时该窗体有标题栏;如果有父,则作为子窗体嵌入到父中,嵌入到父时,标题栏都不会存在了。

2. 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作为其父,依然是弹出上面的窗体,即不会像一般的QWidget一旦有父了,就i没有了标题栏和边框而嵌入到父窗体。

3. Qt::Dialog:

     等同于创建一个QDialog的窗体。

4. Qt::Sheet   

       这个标志貌似只在mac系统下起作用,Windows下试了没啥效果,等同于设置窗体为模态窗体。Qt官方文档建议用QWidget::setWindowModality(), or QDialog::open(),函数设置,而不建议用该标志。

5. Qt::Drawer

      是Qt::Sheet 和 Qt::Dialog的组合,等同于Qt::Sheet | Qt::Dialog,只在mac系统下起作用,Windows系统不起作用。

6. Qt::Popup

     按Qt文档的解释是弹出式的顶层模态窗体,有边框,但是如下代码:

#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();
 
}

却出现如下现象:

设置过Qt::Popup标志的窗体最顶层,没有边框,且鼠标一直转圈等待状态,单击其它窗体后,Qt::Popup标志的窗体消失不见了,原因不知道。

7. Qt::Tool

       该标志指示该窗体是一个工具窗口。工具窗体比普通一般窗体的标题栏小,且有时有些其它的装饰。它的典型用途是用来做工具栏。如果设置该标志的窗体有父窗体,则该标志的窗体一直在其父的上面,即置顶;如果没有父,你应该考虑为该窗体设置Qt::WindowStaysOnTopHint属性,你也可以组合Qt::FramelessWindowHint标志使用。

8. 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();

}

可以看到设置该标志后,窗体标题栏、边框都没有了

9. Qt::SplashScreen

       指示该窗体用作闪屏。闪屏是有些软件在主窗体弹出之前,经常会用一个无边框的小窗口弹出一些提示信息,如:加载组件或库的进度、产品信息等信息,之后该闪屏窗体小时,主程序界面显示出来。

10. 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不可见了。

11. Qt::SubWindow

指示该窗体是一个子窗体,类似Qt的QMdiSubWindow窗体。

----------------------------------------------------------------------------------------------------------------

Qt::WidgetAttribute枚举属性用setAttribute函数设置,当该函数的第二个参数设置为true时,则设置该属性;当该函数的第二个参数设置为false,表示移除关闭该属性。下面分类说明:

12. Qt::WA_AcceptDrops

      窗体接受拖放,等同于调用QWidget::setAcceptDrops函数。

13. 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();

}

弹出如下:

 右侧parent窗体是当前具有焦点的窗体,左侧Windows窗体没有焦点,此时鼠标移动到左侧窗体,依然显示了工具栏提示。

14. 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提示,原因不知道

 16. Qt::WA_DeleteOnClose

        设置这个标志的窗体当窗体关闭事件closeEvent()发生时,会自动由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已经删除过p,不需要再delete了,如果再delete一次,此处会奔溃
   }
}

这种方法有个弊端:因为这个指针Qt是没有办法自动设为nullptr,会变为野指针,这也是上面人为删除崩溃的原因。

17. Qt::WA_Disabled

        当窗体该标志为true后,窗体的keyPressEvent、keyReleaseEvent、mouseReleaseEvent(), mouseDoubleClickEvent(), mouseMoveEvents事件都不会触发、不会响应;注意:窗体上的部件如按钮、编辑框的单击、输入等依然有效。当窗体上的小部件如按钮、编辑框等的该标志设置为true后,小部件为禁用状态,相当于调用setDisabled(true),按钮、编辑框的单击、输入等依然无效

18. Qt::WA_DontShowOnScreen

     这个标志指示窗体隐藏或不是桌面可见区域的一部分。相当于对窗体调用hide()或setVisible(false)函数

19. Qt::WA_Hover

       设置这个标志true后,每当鼠标进入窗体或离开窗体都会发送paint events事件,即如果窗体重写了paintEvent,则paintEvent会被调用。

20. Qt::WA_InputMethodEnabled

      设置这个标志为true后,则开启亚洲输入法事件,Qwidget的QInputMethodEvent事件就会触发。例如:在一个密码框中禁止输入中文、日文、韩文等亚洲文字作为密码,这种情况一般我们会重写QLineEdit,但是过于复杂,下面通过设置编辑框的Qt::WA_InputMethodEnabled一句代码搞定:

ui.textEdit->setAttribute(Qt::WA_InputMethodEnabled, false);

21. Qt::WA_MouseTracking

设置为true后,等同调用setMouseTracking(true)

22. Qt::WA_OpaquePaintEvent

这个标志的解释,请参见《Qt::WA_OpaquePaintEvent理解

23. Qt::WA_NoMousePropagation

这个标志的解释,请参见《Qt::WA_NoMousePropagation用法

24. Qt::WA_QuitOnClose

这个标志的解释,请参见《Qt::WA_QuitOnClose用法

25. Qt::WA_Resized

      这个标志默认为true,当设置为false后,窗体在改变大小时,不会发送QResizeEvent事件,即resizeEvent(QResizeEvent* event)函数不会进入、不会响应,但按住鼠标能改变窗体大小。

26. Qt::WA_StaticContents

       请参见Qt::WA_StaticContents标识作用,Qt自带的例子scribble也用到了该标识,该工程在Qt安装目录下的Examples\Qt-5.14.1\widgets\widgetsscribble      目录,官方对该例子的文档说明参见:Scribble Example | Qt Widgets 5.15.7

29. Qt::WA_ShowWithoutActivating

       设置该标志为true后,以非激活模式显示窗体。即窗体显示出来后,但不具备焦点,即键盘事件发生时,该窗体不会收到;键盘事件不发到该窗体上。

30. Qt::WA_AcceptTouchEvents

      设置该标志为true后,允许触摸事件( QTouchEvent)发送到该窗体。在所有能处理触摸事件的窗体上都要将该属性设置为true,如果不设置为true,则将所有的触摸事件当为鼠标事件来处理。

31. Qt::WA_TabletTracking

相当于调用setTabletTracking,至于什么是Tablet   Tracking 请参见

Qt Designer中部件的tabletTracking和mouseTracking属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值