Qt学习笔记2:QMainWindow和QWidget的区别

在Qt工程创建时,Qt Widget Application模板下提供了不同的父类继承。
这里,主要分析一下QMainWindow和QWidget的区别。

创建工程

分别以QMainWindow和QWidget为基类创建工程,工程创建完成后,如下图所示:

1

Qt会自动创建一个以所选基类为父类的自定义类,自动创建ui文件,供用户来使用。代码模板也是完全相同,唯一不同的是一个隐含的文件

QWidget下为 #include “ui_widget.h”
QMainWindow下为 #include “ui_mainwindow.h”

查看该文件,按住ctrl+鼠标左键自动跳转,提示失败。因为这个文件是在编译时Qt自动创建的,在工程创建完成时还不存在。
编译工程后,发现可以跳转到该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是没有这几点的。

页面布局

编译这两种工程,生成页面如下:

2

3

不仔细看的话真的是看不出差别。
QWidget运行后就只有一个“页面”,而QMainWindow运行后生成了一个“窗口”。
QMainWindow的布局如下图所示:

4

从外到内依次是菜单栏、状态栏、工具栏、停靠窗口、中心窗口。
查看帮助文档可以发现,setMenuBar、addToolBar、setCentralWidget、setStatusBar几种行为只有QMainWindow类具有。
因此,在继承自QWidget类的用户类中无法创建菜单栏等几种行为。
这就是QMainWindow和QWidget的主要区别。

代码设计

QWidget类的工程的参考Qt学习笔记1:创建一个Qt的空项目

这里主要是实现一下继承基类QMainWindow的工程。

创建一个空项目

参考Qt学习笔记1的步骤创建一个空项目,在添加自定义类时基类选择QMainWindow。

窗口初始化

创建完成后,为自定义类添加主窗口初始化代码:

void MainWindow::initMainWindow(void)
{
    menuBar = new QMenuBar(this);
    setMenuBar(menuBar);

    toolBar = new QToolBar(this);
    addToolBar(toolBar);

    centralWidget = new QWidget(this);
    setCentralWidget(centralWidget);

    statusBar = new QStatusBar(this);
    setStatusBar(statusBar);
}

在构造函数中调用主窗口初始化行为,运行后发现此时空项目已经与QMainWindow模板创建的页面一致了。

使用菜单栏、工具栏和状态提示条

下面为主窗口添加菜单和工具栏:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    /* create main window */
    initMainWindow();

    QAction *aboutAction = new QAction(tr("AboutQt"), this);
    aboutAction->setStatusTip(tr("About Qt"));
    aboutAction->setIcon(QIcon(":/images/Qt.png"));

    QMenu *aboutMenu = menuBar->addMenu(tr("About"));
    aboutMenu->addAction(aboutAction);

    toolBar->addAction(aboutAction);

    connect(aboutAction, SIGNAL(triggered(bool)), this, SLOT(aboutQt()));

}

void MainWindow::aboutQt()
{
    qApp->aboutQt();
}

创建一个菜单,添加一个Action为关于Qt;创建一个工具条,添加一个Action为关于Qt;
设置关于Qt的Action提示语为“About Qt”;为关于Qt的Action设置触发连接槽,打开关于Qt的页面。
这段代码运行后,结果如下图:

5

页面中可以看到已经出现了一个关于Qt的菜单和工具图标,鼠标放在图标上,状态栏会出现“About Qt”的提示。
点击图标,跳出关于Qt的页面:
这里写图片描述

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页