-
一个完整的QT GUI界面是由一个一个的基本矩形窗口拼接起来的,这些基本窗口通过树形结构组织起来,子窗口只能显示在父窗口内,不能移动到父窗口外。可以通过下列方法设置窗口父子关系:
//方法一,直接设置父子窗口关系 void QWidget::setParent(QWidget *parent); //方法二,间接设置父子窗口关系 QWidget *parent = new QWidget; QHBoxLayout *parentLayout = new QHBoxLayout; QWidget *child = new QWidget; parent->setLayout(parentLayout); parentLayout->addWidget(child);//把child的父窗口设置为parent
- 官方文档
- 可以看到Qt有很多类型的窗口,其中最常见的类型就是
Qt::Widget
和Qt::Window
。为了方便记忆,我个人习惯上把Qt窗口分为两大类型:Qt::Widget
和Qt::Window
,其余类型都可以看做Qt::Window
类型的子类型 - 两者区别
-
区别一:
Qt::Window
类型的窗口默认有系统边框(frame),而Qt::Widget
类型的窗口没有系统边框- 对于
Qt::Window
类型,可以通过setWindowFlags(Qt::FramelessWindowHint)
设置是否显示边框。
- 对于
-
区别二:某个窗口不是应用程序根窗口,如果它是
Qt::Widget
类型,则默认显示;如果它是Qt::Window
类型,则默认不显示,需要手动调用下列函数之一才会显示:QWidget::setVisible(bool); QWidget::show(); QWidget::exec();
-
区别三:
Qt::Widget
类型的窗口默认只能显示在父窗口区域内,而Qt::Window
类型的窗口默认可以移动到父窗口区域外部。
-
- 设置窗口类型
- 设置窗口类型的方式有两种,显式设置窗口类型和隐式设置窗口类型。
-
通过下列函数显式定义窗口类型:
QWidget::setWindowFlag(Qt::WindowType flag, bool on = true)
-
有些方法可以隐式设置窗口类型,举几个例子:
QHBoxLayout::addWidget(QWidget *widget);//把widget的类型设置为Qt::Widget QWidget::setParent(QWidget *parent);//把widget的类型设置为Qt::Widget QDialog;//默认类型为Qt::Dialog //如果一个窗口没有parent,那么这个窗口会被自动设置为Qt::Window类型,且不可更改
-
- 设置窗口类型的方式有两种,显式设置窗口类型和隐式设置窗口类型。
- 其它常见类型
类型 特点 Qt::Widget 无系统边框,非top level窗口 Qt::Window 有系统边框,top level窗口 Qt::Dialog 有系统边框,一般是top level窗口,也可以有父窗口,如果有父窗口,则位于父窗口中心位置 Qt::Sheet 有系统边框 Qt::Tool 有系统边框,但边框右上角无最小化按钮,只有关闭按钮 Qt::ToolTip 无系统边框,且始终悬浮于所有窗口上方 Qt::Popup 无系统边框,具有一个特性:点击应用会引起该窗口消失 Qt::SplashScreen 有系统边框,又称为launch screen Qt::SubWindow 有系统边框,和Qt::Window差别在于它不是顶层控件
- 简单学过网页开发的应该知道CSS盒模型,QT窗口同样有盒模型,QT的窗口盒模型结构和CSS一模一样:每个窗口被划分为四个部分:margin,border,padding,content。
- 窗口模态是指的当某个窗口显示的时候,它的父窗口以及祖先窗口是否响应用户的交互。窗口模态分为三个等级:
-
Qt::NonModal
非模态:不关闭父窗口以及祖先窗口与用户的交互; -
Qt::WindowModal
半模态:关闭父窗口、父窗口的父窗口及兄弟窗口与用户的交互。 -
Qt::ApplicationModal
模态:关闭整个应用程序其它所有窗口与用户的交互。 可以通过下列函数设置窗口模态:QWidget::setWindowModality(Qt::WindowModality); //true=>Qt::ApplicationModal;false=>Qt::NonModal QWidget::setModal(bool); //隐式设置为Qt::ApplicationModal QWidget::exec();
-