QT学习笔记之QT中QWidget、QDialog以及MainWindow的区别

QT中QMainWindow和QWidget的区别

在Qt工程创建时,Qt Widget Application模板下提供了不同的父类继承。

Qt会自动创建一个以所选基类为父类的自定义类,自动创建ui文件,供用户来使用。代码模板也是完全相同,唯一不同的是一个隐含的文件。而这个隐含文件是在编译的时候才自动生成的,在创建工程的时候还没有生成。
QWidget下为 #include “ui_widget.h”
QMainWindow下为 #include “ui_mainwindow.h”

编译工程后,按住ctrl+鼠标左键自动跳转发现可以跳转到该h文件。比较这两个文件,主要差异在于下面几行代码:

menuBar = new QMenuBar(MainWindow);
menuBar->setObjectName(QStringLiteral("menuBar"));
MainWindow->setMenuBar(menuBar);
mainToolBar = new QToolBar(MainWindow);
mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
MainWindow->addToolBar(mainToolBar);
centralWidget = new QWidget(MainWindow);
centralWidget->setObjectName(QStringLiteral("centralWidget"));
MainWindow->setCentralWidget(centralWidget);
statusBar = new QStatusBar(MainWindow);
statusBar->setObjectName(QStringLiteral("statusBar"));
MainWindow->setStatusBar(statusBar);

QMainWindow中在setUi时自动为用户创建了一个菜单栏、工具栏、中心窗口和状态栏。而QWidget是没有这几点的。

QWidget运行后就只有一个“页面”,而QMainWindow运行后生成了一个“窗口”。

QMainWindow的布局如下图所示:

Qt学习_工具条


从外到内依次是菜单栏、状态栏、工具栏、停靠窗口、中心窗口。

QMainWindow和QWidget的主要区别:

在继承自QWidget类的用户类中无法创建菜单栏等几种行为(setMenuBar、addToolBar、setCentralWidget、setStatusBar),而继承自QMainWindow类的用户类中可以。

QT中QWidget、QDialog以及MainWindow的区别

QWidget类是所有用户界面对象的基类。 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己。每一个窗口部件都是矩形的,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。

QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围菜单、工具条和一个状态条。QMainWindow常常被继承,因为这使得封装中央部件、菜单和工具条以及窗口状态条变得更容易,当用户点击菜单项或者工具条按钮时,槽会被调用。

QDialog 是最普通的顶级窗口。一个不会被嵌入到父窗口部件的窗口部件叫做顶级窗口部件。通常情况下,顶级窗口部件是有框架和标题栏的窗口(尽管使用了一定的窗口部件标记,创建顶级窗口部件时也可能没有这些装饰。)在Qt中,QMainWindow和不同的QDialog的子类是最普通的顶级窗口

如果是主窗体,就选择QMainWindow,如果是顶级对话框,就选择QDialog,如果不确定,或者前两种情况都有,那么,就选择QWidget。