打开QT Creator,新建一个“应用程序-Qt Widgets Application”项目:

输入名称scdc之后点击下一步。

在“构建套件”这个页面中直接点出下一步,然后再输入自己的类名DataCenter,其它不用手动改过来,QT会自动修改,如下图所示:

再点下一步,完成即可了。

这个时候直接点击左下方的“运行”按键,窗体就会出现了。

先看一看项目列表中所列的文件

这些文件分别是:

  1. datacenter.h
  2. datacenter.cpp
  3. main.cpp
  4. datacenter.ui 界面设计文件
  5. ui_datacenter.h 这个文件没有在左边的列表中,而是被datacenter.cpp所包含。

main.cpp

#include "datacenter.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
DataCenter w;
w.show(); return a.exec();
}

首先来到的是main.cpp这个文件,因为这儿有一个main函数。对于一般的C/C++应用程序来说,main就是程序的起点。所以我们从这里开始分析。

QApplication a(argc, argv);

这一句的含义是实例化一个QApplication类,类的名字是a,传过去的参数则为argc和argv。

我们知道,argc是参数的个数,而argv是各个参数的指针(双重指针)。

官方的文档是这样写的:

    The QApplication class manages the GUI application's control flow and main settings.

    QApplication contains the main event loop, where all events from the window system and other sources are processed and dispatched. It also handles the application's initialization, finalization, and provides session management. In addition, QApplication handles most of the system-wide and application-wide settings.

    For any GUI application using Qt, there is precisely one QApplication object, no matter whether the application has , ,  or more windows at any given time. For non-GUI Qt applications, use QCoreApplication instead, as it does not depend on the QtGui library.

    The QApplication object is accessible through the instance() function that returns a pointer equivalent to the global qApp pointer.

DataCenter w;

实例化一个DataCenter类,类的名字是w。DataCenter类是继承自QMainWindow,我们去了解一下QMainWindow类。

QMainWindow类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。

主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围菜单、工具条和一个状态条。QMainWindow常常被继承,因为这使得封装中央部件、菜单和工具条以及窗口状态变得更容易。继承使创建当用户点击菜单项或者工具条按钮时被调用的槽成为可能。你也可以使用Qt设计器来创建主窗口。

w.show();

显示这个窗口部件和它的子窗口部件。

return a.exec();

程序进入消息循环,等待可能输入进行响应。这里main()把控制权转交给Qt,Qt完成事件处理工作,当应用程序退出的时候exec()的值就会返回。在exec()中,Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。

因为这是一个QApplication类型的程序,所以一般情况下不需要向控制台窗口打印信息,如果需要的话请使用system命令:

#include "datacenter-import.h"
#include <iostream> DataCenterImport::DataCenterImport()
{
system("echo Hello, Merlin");
}

为什么不是cout来打印?

暂时不十分清楚,我想就是因为它是界面应用程序吧,而cout是用于控制台程序的。若使用cout则需要界面退出之后才会将要打印的字符打印到控制台中来。

另外一种方法更值得推荐,使用qDebug:

首先要添加头文件#include <QDebug>

然后在要输出调试信息到控制台时加上这一行就行了:

qDebug("Test:::%d", 243);

效果是这样子的,是不是很合适?


datacenter.h

#ifndef DATACENTER_H
#define DATACENTER_H #include <QMainWindow> namespace Ui {
class DataCenter;
} class DataCenter : public QMainWindow
{
Q_OBJECT public:
explicit DataCenter(QWidget *parent = );
~DataCenter(); private:
Ui::DataCenter *ui;
}; #endif // DATACENTER_H

datacenter.cpp

#include "datacenter.h"
#include "ui_datacenter.h" DataCenter::DataCenter(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::DataCenter)
{
ui->setupUi(this);
} DataCenter::~DataCenter()
{
delete ui;
}

与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。上面的QMainWindow(parent)和ui(new Ui::DataCenter)就是初始化列表。

ui_datacenter.h

/********************************************************************************
** Form generated from reading UI file 'datacenter.ui'
**
** Created by: Qt User Interface Compiler version 5.2.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/ #ifndef UI_DATACENTER_H
#define UI_DATACENTER_H #include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenu>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QTextBrowser>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget> QT_BEGIN_NAMESPACE class Ui_DataCenter
{
public:
QAction *actionLicense;
QAction *actionAbout;
QAction *actionNew;
QAction *actionOpen;
QAction *actionSave;
QAction *actionSave_as;
QAction *actionTemp_list;
QAction *actionExit;
QWidget *centralWidget;
QPushButton *pushButton;
QTextBrowser *textBrowser;
QMenuBar *menuBar;
QMenu *File;
QMenu *View;
QMenu *Tool;
QMenu *About;
QToolBar *mainToolBar;
QStatusBar *statusBar; void setupUi(QMainWindow *DataCenter)
{
if (DataCenter->objectName().isEmpty())
DataCenter->setObjectName(QStringLiteral("DataCenter"));
DataCenter->resize(, );
QIcon icon;
icon.addFile(QStringLiteral(":/res/scdc.ico"), QSize(), QIcon::Normal, QIcon::Off);
DataCenter->setWindowIcon(icon);
actionLicense = new QAction(DataCenter);
actionLicense->setObjectName(QStringLiteral("actionLicense"));
actionLicense->setIcon(icon);
actionAbout = new QAction(DataCenter);
actionAbout->setObjectName(QStringLiteral("actionAbout"));
actionNew = new QAction(DataCenter);
actionNew->setObjectName(QStringLiteral("actionNew"));
actionOpen = new QAction(DataCenter);
actionOpen->setObjectName(QStringLiteral("actionOpen"));
actionSave = new QAction(DataCenter);
actionSave->setObjectName(QStringLiteral("actionSave"));
actionSave_as = new QAction(DataCenter);
actionSave_as->setObjectName(QStringLiteral("actionSave_as"));
actionTemp_list = new QAction(DataCenter);
actionTemp_list->setObjectName(QStringLiteral("actionTemp_list"));
actionExit = new QAction(DataCenter);
actionExit->setObjectName(QStringLiteral("actionExit"));
centralWidget = new QWidget(DataCenter);
centralWidget->setObjectName(QStringLiteral("centralWidget"));
pushButton = new QPushButton(centralWidget);
pushButton->setObjectName(QStringLiteral("pushButton"));
pushButton->setGeometry(QRect(, , , ));
textBrowser = new QTextBrowser(centralWidget);
textBrowser->setObjectName(QStringLiteral("textBrowser"));
textBrowser->setGeometry(QRect(, , , ));
DataCenter->setCentralWidget(centralWidget);
menuBar = new QMenuBar(DataCenter);
menuBar->setObjectName(QStringLiteral("menuBar"));
menuBar->setGeometry(QRect(, , , ));
File = new QMenu(menuBar);
File->setObjectName(QStringLiteral("File"));
View = new QMenu(menuBar);
View->setObjectName(QStringLiteral("View"));
Tool = new QMenu(menuBar);
Tool->setObjectName(QStringLiteral("Tool"));
About = new QMenu(menuBar);
About->setObjectName(QStringLiteral("About"));
DataCenter->setMenuBar(menuBar);
mainToolBar = new QToolBar(DataCenter);
mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
mainToolBar->setMovable(false);
DataCenter->addToolBar(Qt::TopToolBarArea, mainToolBar);
DataCenter->insertToolBarBreak(mainToolBar);
statusBar = new QStatusBar(DataCenter);
statusBar->setObjectName(QStringLiteral("statusBar"));
DataCenter->setStatusBar(statusBar); menuBar->addAction(File->menuAction());
menuBar->addAction(View->menuAction());
menuBar->addAction(Tool->menuAction());
menuBar->addAction(About->menuAction());
File->addAction(actionNew);
File->addAction(actionOpen);
File->addAction(actionSave);
File->addAction(actionSave_as);
File->addSeparator();
File->addAction(actionTemp_list);
File->addSeparator();
File->addAction(actionExit);
About->addAction(actionLicense);
About->addAction(actionAbout); retranslateUi(DataCenter); QMetaObject::connectSlotsByName(DataCenter);
} // setupUi void retranslateUi(QMainWindow *DataCenter)
{
DataCenter->setWindowTitle(QApplication::translate("DataCenter", "DataCenter - Copyright 2012-2014 senscom", ));
actionLicense->setText(QApplication::translate("DataCenter", "\350\256\270\345\217\257", ));
actionAbout->setText(QApplication::translate("DataCenter", "\345\205\263\344\272\216", ));
actionNew->setText(QApplication::translate("DataCenter", "New", ));
actionOpen->setText(QApplication::translate("DataCenter", "Open", ));
actionSave->setText(QApplication::translate("DataCenter", "Save", ));
actionSave_as->setText(QApplication::translate("DataCenter", "Save as...", ));
actionTemp_list->setText(QApplication::translate("DataCenter", "temp list....", ));
actionExit->setText(QApplication::translate("DataCenter", "Exit", ));
pushButton->setText(QApplication::translate("DataCenter", "PushButton", ));
File->setTitle(QApplication::translate("DataCenter", "\346\226\207\344\273\266", ));
View->setTitle(QApplication::translate("DataCenter", "\346\237\245\347\234\213", ));
Tool->setTitle(QApplication::translate("DataCenter", "\345\267\245\345\205\267", ));
About->setTitle(QApplication::translate("DataCenter", "\345\205\263\344\272\216", ));
} // retranslateUi }; namespace Ui {
class DataCenter: public Ui_DataCenter {};
} // namespace Ui QT_END_NAMESPACE #endif // UI_DATACENTER_H

QT最简单的程序执行过程分析(内含C++基础知识)的更多相关文章

  1. ASP.NET MVC应用程序执行过程分析

    ASP.NET MVC应用程序执行过程分析 2009-08-14 17:57 朱先忠 朱先忠的博客 字号:T | T   ASP.NET MVC框架提供了支持Visual Studio的工程模板.本文 ...

  2. 后端程序员必备的 Linux 基础知识

    1. 从认识操作系统开始 正式开始 Linux 之前,简单花一点点篇幅科普一下操作系统相关的内容. 1.1. 操作系统简介 我通过以下四点介绍什么是操作系统: 操作系统(Operating Syste ...

  3. <每日一题>题目19:简单的程序执行效率面试题

    # 将下面的函数按照执行效率高低排序.它们都接受由0至1之间的数字构成的列表作为输入.这个列表可以很长.一个输入列表的示例如下:[random.random() for i in range(1000 ...

  4. Delphi的程序单元、结构、基础知识(转)

    Object Passal的程序结构很特殊,与其它语言如C++,Object Windows等结构都不同.一个Delphi程序由多个称为单元的源代码模块组成.使用单元可以把一个大型程序分成多个逻辑相关 ...

  5. 后端程序员必备的Linux基础知识

    我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snailclimb/Java-Guide > ...

  6. 前端&后端程序员必备的Linux基础知识

    一 从认识操作系统开始 1.1 操作系统简介 我通过以下四点介绍什么操作系统: 操作系统(Operation System,简称OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石: 操作 ...

  7. 后端程序员必备的 Linux 基础知识+常见命令(近万字总结)

    大家好!我是 Guide 哥,Java 后端开发.一个会一点前端,喜欢烹饪的自由少年. 今天这篇文章中简单介绍一下一个 Java 程序员必知的 Linux 的一些概念以及常见命令. 如果文章有任何需要 ...

  8. 微信小程序入门到实战(1)-基础知识

    1.微信小程序介绍 微信小程序,简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用. 1.1. 为什么是微信 ...

  9. 微信小程序开发(一)----- 基础知识

    1.什么是微信小程序 概念:小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用,体现了“用完即走”的理念,用户不需要关心是否安装太多应用的问题, ...

随机推荐

  1. netback于kthread遇到cpu affinity问题

    最近的升级netback, 在测试过程中,查找vm全双工压力,rx的pps波动很厉害,见rx kthread尽管cpu affinity它是0-7 (dom0 8vcpu), 但往往,她去了物理破坏c ...

  2. spring多数据源的配置(转)

    C3P0和DBCP的区别 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等.   d ...

  3. 5.非关系数据库(Nosql)它mongodb:创建一个集合,导出和导入备份, 数据恢复,进出口

     1 固定集合 固定集合值得是事先创建并且大小固定的集合 2 固定集合的特征:固定集合非常像环形队列.假设空间不足,最早文档就会被删除,为新的文档腾出空间.一般来说.固定集合适用于不论什么想要自己 ...

  4. NSIS:IfFileExists+Goto实现简单跳转

    原文 NSIS:IfFileExists+Goto实现简单跳转 在用户手册中有相关示例,但也许有的同学没有发现,那么我再发一个,仅供入门学习参考. IfFileExists 要检测的文件 文件存在时跳 ...

  5. S关于使用QL声明 找出同时满足多个tag拍摄条件设置算法

    表结构 Tag Table:{tag_id, tag_name}  #标签表 News Table:{news_id, title,......}  #新闻列表 NewsTags Table:{tag ...

  6. [Django1.6]The MEDIA_ROOT and STATIC_ROOT settings must different 解决

    该项目有一个图片上传功能,为了把上传路径很简单,写在同一个静态文件路径,于wi7执行机器上没问题,今centos我们报道了机上,如下面的错误: django.core.exceptions.Impro ...

  7. 【翻译】在Ext JS 5应用程序中怎样使用路由

    原文:How to Use Routing in Your Ext JS 5 Apps 简单介绍 Ext JS 5是一个重要的公布版本号,它提供了很多新特性来创建丰富的.企业级的Web应用程序.MVV ...

  8. Oracle查询速度慢的原因总结

    Oracle查询速度慢的原因总结 查询速度慢的原因很多,常见如下几种:1,没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)2,I/O吞吐量小,形成了瓶颈效应.3,没有创建计算列导致 ...

  9. GG同步sqlserver报错一个案例 Invalid date format

    在里面Oracle表同步sqlserver时间,在sqlserver当应用程序数据的结束.您可能会遇到这个错误. 2014-05-17 17:20:24 WARNING OGG-01154 SQL e ...

  10. shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、功能、select

    1.expr计算整数变量值 s=`expr 2 + 3` 运算符号和參数之间要有空格分开: 2.let命令 let s=(2+3)*4 echo $s 3.for语句 for 变量 in 列表 do ...