目录
29. Qt::WA_ShowWithoutActivating
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 请参见