在Qt工程创建时,Qt Widget Application模板下提供了不同的父类继承。
这里,主要分析一下QMainWindow和QWidget的区别。
创建工程
分别以QMainWindow和QWidget为基类创建工程,工程创建完成后,如下图所示:
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->
QMainWindow中在setUi时自动为用户创建了一个菜单栏、工具栏、中心窗口和状态栏。而QWidget是没有这几点的。
页面布局
编译这两种工程,生成页面如下:
不仔细看的话真的是看不出差别。
QWidget运行后就只有一个“页面”,而QMainWindow运行后生成了一个“窗口”。
QMainWindow的布局如下图所示:
从外到内依次是菜单栏、状态栏、工具栏、停靠窗口、中心窗口。
查看帮助文档可以发现,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()
创建一个菜单,添加一个Action为关于Qt;创建一个工具条,添加一个Action为关于Qt;
设置关于Qt的Action提示语为“About Qt”;为关于Qt的Action设置触发连接槽,打开关于Qt的页面。
这段代码运行后,结果如下图:
页面中可以看到已经出现了一个关于Qt的菜单和工具图标,鼠标放在图标上,状态栏会出现“About Qt”的提示。
点击图标,跳出关于Qt的页面: