QT中setWindowFlags和 setAttribute使用详解及注意问题

1. setWindowFlags(QT::WindowFlags)主要设置一些窗口标志,平常开发中主要有两类需求:


 1.1    将某一子窗口设置为最顶层窗口。

           使用Qt::Tool 属性:setWindowFlags(Qt::Tool) 

 1.2    重新定义窗口的属性,比如:取掉最大、最小、关闭等按钮,或者直接使用无边框窗口

                 注意:很多人可能使用1.2中设置属性,但是总是不成功,其原因是如果子窗口有父亲,则窗口属性也被父亲控制,这时候的这个子窗口其实并不是严格意义上的完整窗口,相当于父窗口的一个部件,所以这时候设置自定义窗口属性,有两种方法:(1)设置父亲窗口属性,(2)给子窗口设置属性的时候加上 Qt::Window 或 Qt::Dialog等指定该子窗口为完整窗口,(Qt::DIalog | Qt::CustomizeWindowHint )


        以下是窗口具体属性介绍:


Qt::Widget : QWidget构造函数的默认值,如新的窗口部件没有父窗口部件,则它是一个独立的窗口,否则就是一个子窗口部件。

Qt::Window : 无论是否有父窗口部件,新窗口部件都是一个窗口,通常有一个窗口边框和一个标题栏。

Qt::Dialog : 新窗口部件是一个对话框,指示部件是应该作为对话框窗口(即标题栏中通常没有最大化或最小化按钮)。这是QDialog的默认类型。如果要将其用作模态对话框,则应从另一个窗口启动它,或者如果有父窗口,则与QWidget::windowModality属性一起使用。如果将其设置为模态,则对话框将阻止应用程序中的其他顶级窗口获取任何输入。我们将具有父级的顶级窗口称为辅助窗口。

Qt::Sheet : 新窗口部件是一个Macintosh表单。

Qt::Drawer : 新窗口部件是一个Macintosh抽屉。

Qt::Popup : 新窗口部件是一个弹出式顶层窗口。

Qt::Tool : 新窗口部件是一个工具窗口,它通常是一个用于显示工具按钮的小窗 

口,如果一个工具窗口有父窗口部件,则它将显示在父窗口部件的上面,否则,将相当于使用了Qt::WindowStaysOnTopHint展示。

Qt::Tooltip : 新窗口部件是一个提示窗口,没有标题栏和窗口边框.

Qt::SplashScreen : 新窗口部件是一个欢迎窗口,它是QSplashScreen构造函数的默认值。

Qt::Desktop : 新窗口部件是桌面,它是QDesktopWidget构造函数的默认值。

Qt::SubWindow : 新窗口部件是一个子窗口,而无论该窗口部件是否有父窗口部件。

Qt::X11BypassWindowManagerHint : 完全忽视窗口管理器,它的作用是产生一个根本不被管理器的无窗口边框的窗口,此时,用户无法使用键盘进行输入,除非手动调用QWidget::ActivateWindow()函数。

Qt::FramelessWindowHint : 产生一个无窗口边框的窗口,此时用户无法移动该窗口和改变它的大小。

Qt::CustomizeWindowHint : 关闭默认的窗口标题提示。

        this->setWindowModality(Qt::WindowModal); //设置窗体为模态


2.  setAttribute(Qt::WA_DeleteOnClose,true)用于设置各种窗口小部件(widget)的属性,平时开发一般两种需求:


 1.1    关闭窗口时删掉实例化的类

           使用Qt::WA_DeleteOnClose 属性:setAttribute(Qt::WA_DeleteOnClose,true) 

 1.2    QT中窗口部件背景透明化

           Qt::WA_NoSystemBackground, Qt::WA_TranslucentBackground:

                  注意:窗口透明还有很多方法,以下列举几个


1.  Qt::WA_DeleteOnClose

      一个QWidget在close()时,对象并没有被删除,可以设置this->setAttribute(Qt::WA_DeleteOnClose,true);使此对象被

      若下次再调用show()就会段错误。不过这种方法有个弊端:因为这个指针是没有办法自动设为NULL,会变为野指针。


2.  Qt::WA_QuitOnClose属性:表示当拥有该属性的最后一个部件接受到QCloseEvent事件时,让Qt终止应用程序。默认情况           下,所有Qt::Window类型的部件都具有该属性。


3.  Qt::WA_NoSystemBackground, Qt::WA_TranslucentBackground:

     setAutoFillBackground(false);  //这个不设置的话就背景变黑  

     setWindowFlags(Qt::FramelessWindowHint);  

     setAttribute(Qt::WA_TranslucentBackground,true); 表示窗口小部件应具有半透明背景,即窗口小部件的任何非不透明区域将       是半透明的(因为窗口小部件将具有Alpha通道。)设置此标志会导致设置WA_NoSystemBackground。在Windows上,窗口       小部件还需要设置Qt :: FramelessWindowHint窗口标志。该标志由小部件的作者设置或清除。


以下为其他几种属性

Qt::WA_PaintOutsidePaintEvent

一般QPainter只能在PaintEvent事件中使用,使用此flag可以使在paintEvent 之外的函数中使用。

Qt::WA_AcceptDrops    允许将拖放操作中的数据拖放到窗口小部件上(请参阅QWidget :: setAcceptDrops())。

Qt::WA_AlwaysShowToolTips    为非活动窗口启用工具提示。

Qt::WA_DeleteOnClose    当窗口小部件接受close事件时,Qt删除此窗口小部件(请参阅QWidget :: closeEvent())。

Qt::WA_Disabled    表示窗口小部件已禁用,即它不接收任何鼠标或键盘事件。还有一个getter函数QWidget :: isEnabled()。这由Qt内核设置/清除。

Qt::WA_DontShowOnScreen    表示窗口小部件已隐藏或不是可查看桌面的一部分。

Qt::WA_MouseTracking    表示窗口小部件已启用鼠标跟踪。请参阅QWidget :: mouseTracking。

Qt::WA_NoMouseReplay    用于弹出窗口小部件(popup)。指示弹出窗口小部件关闭时不应重播最近的鼠标按下事件。该标志由小部件的作者设置,并在每次小部件接收到新的鼠标事件时由Qt内核清除。