我们都知道,在QT中基于Qobject的窗口有两类,QWidget和QWindow,当然,这两类下又有QDialog,QWidget,QMainWindow,QSplashScreen,QMidSubWindow,QDesktopWidget五个类。
这里,我们来看看QMainWindow。
为探究console与窗口程序的不同,我们从一个console程序开始,通过比较异同来逐渐实现窗口程序。
首先我们建立一个console程序,看其中的代码:
#include <QCoreApplication>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
return a.exec();
}
我们发现这里没有任何Widget的痕迹,而建立一个正常的窗口程序,至少会有Form或者Dialog或者Window的字眼和类出现。
这里我们来修改一下,为console程序增加一个Form:
按照默认的参数,直接下一步
添加完成,我们代码进行修改,增加刚才的form类的头文件,并且声明变量实例显示出来:
#include <QCoreApplication>
#include <form.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Form frm
frm.show();
return a.exec();
}
编译时第一个错误来了: error: QWidget: No such file or directory
出现这个错误,主要是无法找到Widget相关的库文及其路径配置,所以我们在Pro文件中,修改QT-=gui,为QT+=widgets即可解决:
同时,在form的头文件中增加头文件集合QtWidgets
此时编译,我们会遇到第二个错误,说Cannot create a QWidget without QApplication
这个时候,错误很明显,很容易解决,那就是说我们的Form没有QAPPlication的支持是不能运行的。在main文件中修改头文件集或者增加#include ,同时将main函数中的QCoreApplication修改为QApplication再次运行则不会出错了,代码如下:
//#include <QCoreApplication>
#include <QApplication>
#include <form.h>
int main(int argc, char *argv[])
{
// QCoreApplication a(argc, argv);
QApplication a(argc, argv);
Form frm;
frm.show();
return a.exec();
}
虽然没有错误了,但会有一个遗憾,那就是不在运行的时候先会显示一个黑框,也就是后台程序的运行环境。如何去掉它呢,将Pro文件中的两行config注销掉即可:
如此,我们可以得到正确的运行结果了,如下图:
细心的伙伴会发现,这个时候,我们的窗口标题是form,而不是我们主程序的标题Untitle2,那么如何恢复主程序的标题呢?这里就要用到QMainWindow了,我们都知道QMainWindow的作用就是提供一个窗口显示的框架(包括菜单栏,标题栏,状态栏,工具栏,否则就无法成为一个比较完备的程序界面)。在主函数中增加如下代码:
#include <QApplication>
#include <form.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Form *frm=new Form();
QMainWindow window;
window.setCentralWidget(frm);
window.resize(frm->width(), frm->height()); //确保主框架能够全面匹配from的大小
window.show();
return a.exec();
}
这样,我们看到,程序的标题就是untitled2了,运行结果如下:
总结提炼:
本文通过改装的方式实践了一次窗体程序的实现。从而理清了QApplication与窗体之间的关系。没有它窗体程序就不能运行。为何会这样呢?我们来看看QApplication它的渊源即刻明白。
1、QApplication、QGuiApplication、QCoreApplication三者之间的关系:
QCoreApplication用于non-GUI的应用程序(不需要依赖QtGui库),QApplication用于包 含GUI的应用程序(需要用到QtGui库)。
QApplication继承了QGuiApplication类,而QGuiApplication继承了QCoreApplication类, 而QCoreApplication又继承QObject的,而QObject就是QT中最基本的基类,也就是QT的根基。
2、QApplication的作用:
QApplication 类管理GUI程序的控制流和主设置。QApplication 包含主事件循环,所有来自窗口系统和其他源的事件将被处理和分配。它也处理程序的初始化,析构和提供会话管理。对于非GUI的用QCoreApplication 代替QApplication,它不依赖QtGui库。qApp是一个全局的指针,指向QApplication的对象。
相比VC而言,在QT中将一个console程序改装为窗体程序更容易吧!
希望对小伙伴们有所帮助!