QT从console程序到到窗口程序之实践

版权声明:本博客所有原创文章转发或者拷贝均须注明出处,本人保留版权法律追诉权。 https://blog.csdn.net/haigear/article/details/84679869

我们都知道,在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程序改装为窗体程序更容易吧!
希望对小伙伴们有所帮助!

猜你喜欢

转载自blog.csdn.net/haigear/article/details/84679869
今日推荐