命令行应用程序:
命令行应用程序是一种基于顺序执行结构的可执行程序,程序执行过程中不需要与用户产生交互,程序执行后给出最终的运行结果。
gcc a.c b.c c.c //编译三个c程序
编译过程中不产生用户交互,编译结束后或者生成可执行程序或者给出错误信息。
ls 就是一个命令行程序,列出目录和文件
main->function1()->function2()
特点:程序的运行有固定的开始和固定的结束。
命令行应用程序使用于:单任务场合,无交互或简单交互场合,服务器应用场合
命令行应用程序是早期计算机系统中的主要程序类型。
图形界面应用程序的诞生:随着计算机技术的发展,计算机走进日常生活,计算机程序开始需要处理各个领域中的问题,计算机用户已经不再是专业的计算机工作者。
如何走进生活呢?
图形界面应用程序是一种基于消息驱动模型的可执行程序,程序的执行依赖于用户的交互工程,程序执行过程中实时响应用户操作。一般情况下程序执行后不会主动退出。
图形界面应用程序的运行模式:
main() 定义主窗口,创建主窗口,创建主窗口中的元素,显示主窗口,进入消息循环。
图形界面应用程序的消息处理模型:
用户操作->(系统内核)系统内核->系统消息->应用程序(消息处理函数)。
图形界面 应用程序适用于:多任务的场合,强用户交互的场合,非专业计算机用户。
图形界面应用程序是当代计算机系统中的主要程序类型。
当代大型软件产品架构模型:
当代软件产品:用户界面交互层(qt,mfc,.net)《=》网络更新模块(命令行程序)。数据库管理模块(命令行程序)。虚拟机引擎模块(命令行程序)小结:
命令行应用程序 图形界面应用程序
基于顺序执行结构 基于消息驱动模型
弱交互执行 由用户触发运行
主动结束 由用户触发结束
2、GUI程序实例分析
现代操作系统支持GUI界面:现代操作系统提供原生SDK支持GUI程序开发,GUI程序开发是现代操作系统上的主流技术,不同操作系统上的GUI开发原理相同,不同操作系统上的GUI SDK不同。
GUI程序在运行时会创建一个消息队列,系统内核将用户操作翻译成对应的程序消息,程序在运行过程中需要实时处理队列中的消息,当队列中没有消息时,程序将处于停滞状态。
用户操作-》操作系统内核-》程序消息-》GUI应用程序。
GUI程序开发:
在代码中用程序创建窗口及窗口元素,在消息处理函数中根据程序消息做出不同相应
经典GUI程序开发模式:
可视化界面开发(通过所见即所得的方式画出界面,开发环境自动生成对应的程序代码)
消息映射(程序中将具体消息映射到指定函数,当消息触发时,函数被调用)
多数操作系统以c的函数的方式提供GUI SDK
以Windows操作系统为例:
RegisterClass 向系统注册GUI窗口式样
CreateWindow 创建窗口或窗口元素
ShowWindow 在屏幕上显示创建好的窗口
UpdateWindow 刷新屏幕上的窗口
GetMessage 获取程序消息队列中的消息
TranslateMessage 翻译系统消息
DispatchMessage 将消息发送到窗口处理函数
小结:现代操作系统提供原生SDK支持GUI程序开发,不同操作系统上的GUI SDK不同,不同操作系统上GUI开发原理相同。
GUI程序开发包括:在代码中用程序创建窗口及窗口元素,在消息处理函数中根据程序消息做出不同相应。
3、GUI用户界面是由固定的窗口元素所构成的
主窗口,菜单栏,工具栏,标签,文本框,按钮。
操作系统提供了创建用户界面元素所需要的函数。各种功能不同的函数依次调用,从而创建出界面元素,操作系统提供的原生函数无法直接映射到界面元素。
如何直观的将界面元素的概念直接映射到程序中?
GUI应用程序是为解决非科学计算问题而诞生的,GUI应用程序使用于非专业的日常生活领域。
面向过程程序设计方法学不适合GUI程序设计,面向对象程序设计方法学更适合GUI程序设计。
用面向对象方法学看待GUI界面元素,所有的界面元素都可以看做实际的对象,GUI用于界面是由各不相同的对象组成的,
主窗口对象:菜单对象,按钮对象,文本框对象。
GUI开发非常适用面向对象方法学:将界面元素定义为对应的类,通过抽象和封装可以隐藏界面元素的细节,程序的创建过程就是组合不同界面元素对象的过程。
Widget<-MainWindow, PushButton
QT是利用面向对象方法学开发的一套GUI组件库,将不同操作系统的GUI细节封装与类的内部,QT提供一套跨平台的类用于开发GUI程序,遵循经典的GUI应用程序开发模式。
小结:GUI程序开发更适合采用面向对象方法学,所有的界面元素都可以看作实际的对象,GUI用户界面是由各不相同的对象组成的,QT是利用面向对象方法学开发的一套GUI组件库,他将GUI细节封装于类的内部,具有跨平台的特性。
4、QT是一套跨平台的GUI开发库,一套c++集成开发环境,一套开源的殿堂级架构技术教程。
第一个qt程序:
#include <Qapplication>
#include <QMainWindow>
#include <QPushButton>
int main(int argc,char* argv[])
{QApplication a(argc,argv); 封装消息的循环
QMainWindow w; 主窗口
QPushButton b(&w); 按钮对象:父窗口:w
b.setText("Hello QT!"); 文字设置为:
w.show();
return a.exec();}
通过命令行的方式编译QT源程序:启动QT命令行,进入源程序所在目录
命令:
1、qmake-project //根据目录中的源码生成工程文件
2、qmake //根据工程文件生成makefile文件
3、make //根据makefile进行编译
QT Creater 是一套可视化的集成开发环境,使用QT Creater可以高效的进行QT开发,QT Creater提供了强大的代码编辑功能,提供了强大的调试功能。
调试的基本方法:
log调试法:在代码中加入一定的打印语句,打印程序状态和关键变量的值。
断点调试法:在开发环境中的对应代码行加上断点,当程序运行到断点行时,程序暂停运行,需要时可加上条件断点,当条件满足才暂停程序的运行。
QT是一套跨平台的c++界面开发库,可以通过命令行的方式开发QT应用程序,也可以通过QT Creater进行QT开发,QT Creater支持log调试和断点调试法。
5、QT Creater 以工程项目的方式对源码进行管理
一个QT Creater 工程包含不同类型的文件
.pro 项目描述文件《==》makefile
.pro.user用户配置描述文件 //拷贝到别的电脑运行可删除
.h 头文件 .cpp源文件
.ui界面描述文件
资源文件(图片,音频,等)
.pro 项目描述文件的基本构成:
#-注释起始符
QT-模块声明
TARGET-可执行文件名
TEMPLATE-程序模板声明
SOURCES-源码文件声明
HEADERS-头文件声明
FORMS-界面文件声明
RC_FILE-资源文件声明
.pro项目描述文件中的高级变量:
INCLUDEPATH-头文件搜索路径
CONFIG-设定项目的配置信息和编译选项。
LIBS-添加第三方库文件
DEFINES-定义编译宏
CONFIG用于设定项目的配置信息和编译选项,常用选项:
debug-构建debug版本的可执行程序
release-构建release版本的可执行程序
debug_and_release-同时构建debug板和release板
warn_on-尽可能多的输出警告信息
warn_off-不输出警告信息
.pro文件的本质为Qt中的makefile文件。
.pro->通过qmake->makefile for windows, makefile for linux makefile for mac OS
QT += core 核心类 gui 界面类
项目文件:
一般来说,项目文件中的描述都使用相对路径,而相对路径是相对于项目文件本身而言,QT Creater将项目文件作为目标文件
注意:
1、QT Creater在打开项目文件的同时会生成.pro.user文件,
2、.pro.user文件包含一些与qt相关的本地配置信息,
3、当需要在不同计算机之间移动项目源码时,建议删除.pro.user文件。
工程中的概念:
构建(build):对项目中的所有文件进行编译,最终生成可执行程序。
Debug板:可以进行程序调试的构建版本(调试板):
可执行程序中包含调试信息,运行效率不高。
Release板:最终发布的应用程序构建版本,无调试信息,运行效率高。阶段性进行release构建
QT Creater以工程项目的方式对源码进行管理,一个QT Creater工程包含不同类型的文件,.pro文件用于配置和组织整个项目的相关信息,.pro文件是Qt中与平台无关的Makefile文件,QT Creater提供了开发所必备的快捷高效的功能。
6、窗口组件及窗口类型
图形用户界面由不同的窗口和窗口组件构成。
<QtGui>头文件包含窗口组件,对应Qt中的GUI模块。
Qt以组件对象的方式构建图形用户界面。
组件的类型:
容器类(父组件):用于包含其他的界面组件。
功能类(子组件):用于实现特定的交互功能、
Qt中没有父组件的顶级组件叫窗口。
QWidget类继承自QObject类和QPaintDevice类:QObject是所有支持QT对象模型的基类,QpaintDevice是Qt中所有可绘制组件的基类。
QWidget能够绘制自己和处理用户的输入,是QT中所有窗口组件类的父亲(super class),是所有窗口组件的抽象,QT中的每个窗口组件都是一个QWidget,QWidget类对象常作为父组件或顶级组件使用。
QWidget w;
w.setWindowTitle("D,T.SOFE");
构造函数:(父组件,样式)
QLabel用于显示一个提示性的字符串,是功能性组件,一般需要父组件作为容器,可以作为窗口存在,但没有意义
QWidget w;//生成QWidget对象,顶级组件
QLabel l(&w);//生成QLabel对象,其父组件为QWidget
/*设置QLabel组件的显示字符串*/
l.setText("this is a label control");
窗口类型:qt中可以根据需要定制窗口式样:窗口类型:
Qt::Dialog-对话框类型(没有最大,最小化)
Qt::Window-主窗口类型(包含最小化,最大化,关闭)
Qt::SplashScreen-启动画面类型() //没有了外部的框
窗口标志:
Qt::WindowStaysOnTopHint //顶级窗口,始终在顶层
Qt::WindowContextHelpButtonHint //最大化最小化换为帮助
qt以组件对象的方式构建图形用户界面,QWidget类是所有用户界面组件的父类,QWidget类对象常作为父组件或顶级组件使用,Qt中可以根据需要定制窗口式样,QLabel用于显示一个提示性的字符串。
#include <QtGui>
#include "Widget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w(NULL, Qt::Window|Qt::WindowStaysOnTopHint|Qt::WindowContextHelpButtonHint);
QLabel l(&w);
l.setText("I'm a label control.");
w.setWindowTitle("D.T.Software");
w.resize(400, 300);
w.show();
return a.exec();
}
QLabel是Gui组件,所以QLabel在Gui模块里边,包含QtGui这个头文件
qt5的一个重大更改就是重新定义了QtGuiM模块,它不在是一个大而全的图形界面库,而是为了各种图形用户界面组件提供一般的处理,包括窗口系统集成,事件处理,opengl和opengl es的集成,2d绘图,基本图像,字体和文本等内容。qt5将以前的QtGui模块中的图形部件类移动到了QtWidgets模块中,将打印相关类移动到了QtPrintSupport模块中。
7、坐标系统
GUI操作系统都有特定的坐标系统,图形界面程序在坐标系统中进行窗口和部件的定位。
定位类型:顶级窗口部件的定位,窗口内部件的定位,窗口部件的大小设置。
qt使用统一的坐标系统定位窗口部件的位置和大小,qt部件类提供成员函数在坐标系统中进行定位,QWidget类提供了窗口部件所需的坐标系统成员函数。左上角是原点。
QWidget类中的坐标系统成员函数:
x(),y(),width(),height(),
geometry():x(),y(),width(),height(),(前两个与上边不一样,后两个一样)
frameGeometry():x(),y(),width(),height(),(前两个与最上边一样,后两个与上边不一样)
geometry(),frameGeometry()中的几何数据必须在show()调用后才有效。
为什么要三组? 为了跨平台
窗口出现之前后之后打印出了不一样的数据,因为要跨平台,并不知道是什么操作系统,所打印出来就出错了。
QWidget类提供了成员函数:
改变窗口部件的大小:
void resize(int w, int h)
void resize(const QSize &)
改变窗口部件的位置:
void move (int x, int y)
void move(const QPoint &)
操作系统的不同,最小的框的大小定义还可能不同。
QPushButton 用于接受用户点击事件,能够显示提示性字符串,是功能性组件,需要父组件作为容器,能够在父组件中进行定位。
QWidget w;
QPushButton b(&w); // 生成 QPushButton对象, 其父组件为 QWidget
b.setText("Button"); // 设置显示的字符串
b.move(10, 10); // 移动到坐标 (10, 10)
b.resize(100, 50); // 设置大小 width = 100, height = 25
小结:QT中的几何坐标以左上角为原定
水平为x轴,从左向右为正向。
垂直为y轴,从上到下为正向。
QT中的GUI组件以左上角进行定位。
QT中的GUI组件可以在坐标系统中进行大小设置。
#include <QtGui/QApplication>
#include <QPushButton>
#include <QDebug>
#include "MainWindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
QPushButton b(&w); // 生成 QPushButton对象, 其父组件为 QWidget
QPushButton b1(&w);
b.setText("Button"); // 设置显示的字符串
b.move(10, 10); // 移动到坐标 (10, 10)
b.resize(100, 50); // 设置大小 width = 100, height = 25
b1.setText("Button"); // 设置显示的字符串
b1.move(120, 10); // 移动到坐标 (120, 10)
b1.resize(100, 50); // 设置大小 width = 100, height = 25
w.resize(100, 100);
w.move(120, 120);
w.show();
qDebug()<<"QWidget:";
qDebug()<<w.x();
qDebug()<<w.y();
qDebug()<<w.width();
qDebug()<<w.height();
qDebug()<<"QWidget::geometry()";
qDebug()<<w.geometry().x();
qDebug()<<w.geometry().y();
qDebug()<<w.geometry().width();
qDebug()<<w.geometry().height();
qDebug()<<"QWidget::frameGeometry()";
qDebug()<<w.frameGeometry().x();
qDebug()<<w.frameGeometry().y();
qDebug()<<w.frameGeometry().width();
qDebug()<<w.frameGeometry().height();
return a.exec();
}