Qt学习之---WindowFlag属性

学习动机:

今天学习了一下Qt的对话框窗体----QDialog。突然想到,如果要实现一个权限登录的对话框,在正确输入用户名密码前,无法关闭此权限登录弹窗应该如何实现?(如下图效果)

                                                 Qt学习之---WindowFlag属性_第1张图片

实现思路:

想实现如上效果,首先想到的是将对话框右上角的红叉隐藏掉或禁止使用。经过百度查找资料,发现用setWindowFlags()方法去改变窗口的WindowsFlag属性就可以实现此效果。

具体细节:

首先在Qt的自带英文资料中找到QDialog,相关资料在Qt的安装目录的Docs文件夹中。

                                Qt学习之---WindowFlag属性_第2张图片

在资料中发现,QDialog的PUBLIC类中并没提到setWindowFlags(),根据经验,这个方法可能是继承自它的父类的,找到它从父类QWidget继承来的Public方法,果然中间有setWindowFlags()。

Qt学习之---WindowFlag属性_第3张图片

点击进入,如下图所示:

Qt学习之---WindowFlag属性_第4张图片


 







什么鬼,点击setWindowFlags()直接给我看WindowFlags!!!!不要在意这些细节。第一句话大概介绍了WindowFlags的功能,它是类别   和   零个或者几个窗体系统提示 的联合体属性。详细见资料。再点开WindowFlags这个链接,看到如下图所示的内容:

Qt学习之---WindowFlag属性_第5张图片

  根据资料我们可以知道WidowFlags属性的值是Qt类中的一个枚举类型WidowFlags类型,这个枚举型类型事包含窗体的一些类型信息,个性化顶层窗口的信息,和一些窗体的功能。找了一下,找到一条跟我需求相关的枚举值,如下图:Qt学习之---WindowFlag属性_第6张图片

看到这里,以为找到了关键信息,正想大干一场,打开VS,准备提笔开写的时候发现,这个信息怎么用呢? 是this->setWindowFlags(Qt::windowCloseButtonHint);这一句话就能搞定吗?管它三七二十一,先试试看吧。结果如下图:

Qt学习之---WindowFlag属性_第7张图片

what????对话框变的没有边框了,而且位置也不对了。。。。这就尴尬了。经过找资料发现,在这里我们忽略了重要的一点,WindowFlogs属性是一个Combination(结合体),具体来说,它其实用一个属性值就涵盖表示了非常多的内容。


it stores an OR combination of WindowType values.以后再看到这句话就要引起注意了,这表示一个参数涵盖了很多细分参数,把细分参数柔和成了一个联合体,在这里的WindowFlags实际上是32位的一个参数,它的每一位都有不同的含义。可想而知,如果我们直接用this->setWindowFlags(Qt::windowCloseButtonHint),这个方法和参数就表示我们把windowCloseButtonHint这一项枚举值用来做窗体WindowFlags的属性值,当然就把代表窗体类型,窗体功能选择的等等位都清零了,所以出现了之前的效果。

到这里,解决方案就很清晰了,依然使用this->setWindowFlags()方法,但是它的参数我们要在它现有参数的基础上进行修改,把它变成(0X)x0xxxxxx,这里的x表示保持之前的内容。保留一个32位数据的31位不变,把其中一位改成0,这要怎么实现呢?有点计算机基础的都不难想明白如下公式。

{1111111011111111(这里0是要置False的位)} 按位与  {原有数据} =  把数据固定位置FALSE的结果

想明白这些也就想出了程序的写法,如下

accessDialog::accessDialog(QWidget *parent)
: QDialog(parent)
{
	this->setWindowFlags(this->windowFlags()&~Qt::WindowCloseButtonHint);
	ui.setupUi(this);
	connect(ui.button_login, SIGNAL(clicked()), this, SLOT(onButtonClicked_login()));
	
}
在Dialog的构造函数中加入上述语句,就能打到屏蔽窗体按钮的效果了。

举一反三:

      利用 WindowFlags属性,我们还可以修改窗体的帮助按钮,最大化按钮,最小化按钮等等等等的功能,详细的需要自己查看资料学习,学习的重点是查找问题的思路。




你可能感兴趣的:(Qt学习)