• 1. 主讲人:黄攀 联系方式:13352503343 电子邮箱:panhuang1987@163.com Qt平台下的C++编程基础
  • 2. 课程介绍本课程共分为5次课程,10个学时。 通过本课程,要求掌握: 什么是Qt以及Qt信号传递机制 上位机控件设置以及控件使用方法 了解基于Qt平台的C++编程 课程结束时,将完成一个基于Qt的应用程序。 交流QQ群:275516932
  • 3. 课程目录第一讲 Qt平台介绍及C++概述 第二讲 C++基本语言介绍并基于Qt编写一个计算器小程序 第三讲 基于Qt平台开始编写时钟应用程序 第四讲 Qt界面美化 第五讲 课程总结,交流课程设计
  • 4. Qt应用软件介绍三维屏保 二维动画绘图 激光陀螺上位机监测软件 车载导航系统 地图绘制软件,时钟初始界面 备忘录软件 音乐播放软件 计算时间差软件 恶搞软件
  • 5. 什么是Qt?
  • 6. Qt简介Qt是一个跨平台的C++图形用户界面库,由挪威Troll Tech公司出品。目前产品包括Qt、基于Framebuffer的Qt Embedded、快速开发工具Qt Designer、国际化工具Qt Linguist等部分。Qt不但支持所有Unix系统,而且支持Linux,也支持Windows平台。
  • 7. Qt简介Qt是基于面向对象的C++语言,它提供了信号(signal)和槽(slot)的对象通信机制,具有可查询和可设计的属性,以及强大的事件和事件过滤器。同时,它还具有字符国际化,即支持根据上下文进行国际化字符串翻译。许多Qt特性基于QObject的继承,通过标准C++技术实现。
  • 8. Qt简介Qt最初是挪威Troll Tech公司出品,后来被诺基亚公司收购,并继续Qt的研发和维护工作,诺基亚推出的塞班系统,其界面即是用Qt进行软件开发的。随着诺基亚放弃塞班系统,Qt团队于今年解散,随之而来的于2012年8月9日被芬兰IT业务供应商Digia收购并继续维护。 基于Linux系统的的ARM平台,在开发其应用界面时,通常使用Qt开发界面及应用程序。
  • 9. Qt特征跨平台性 面向对象 组件间的相互通信 用户自定义国际化 丰富的API函数 可用户化的外观 优越的绘画功能 绘制2D/3D图形功能Qt作为新型的GUI开发工具,具有与一般的工具包所不同的特征,使它的应用非常广泛。
  • 10. 常用的Qt类主要的类描述抽象窗口部件类抽象窗口部件类是通过子类来使用的。高级窗口部件类高级的GUI窗口部件,比如列表视图和进度条基本窗口部件类基本的GUI窗口部件,比如按钮、组合框和滚动条数据库类与数据库相关的类,比如与SQL数据库相关的类。日期与时间类处理日期与时间的类拖放类处理拖放和MIME类型的编码和解码类环境类提供了多样全面的服务,比如事件处理、系统设置访问和国际化等 服务的类事件类用来生成和处理事件的类非GUI类非GUI类是一个集合类。比如:列表、队列、堆栈和字符串,它们 不需要QApplication类就可以和其他类一起使用。多媒体、图形和打印类该类主要提供支持图形(2D、3D和OpenGL),图像的编码、解码和处理,声音,动画,打印等等。帮助系统类用来给应用程序提供在线帮助的类。布局管理类用来处理自动调整窗口部件的大小和位置,能够构成复杂对话框的类。共享类为了快速复制而使用引用计数的类。
  • 11. Qt能干什么?
  • 12. Qt应用工程上位机软件 电脑应用软件 手机应用软件 嵌入式系统平台及软件 游戏软件
  • 13. 上位机软件介绍上位机指计算机人机界面部分,与下位机通信,可对下位机系统进行监控和维护。 常用的上位机编程软件主要有:MFC,LabView,Qt,西门子WinCC,组态王等。 上位机常用的接口:RS232、RS485、以太网接口。
  • 14. 上位机软件介绍
  • 15. 电脑应用软件
  • 16. 手机应用软件
  • 17. 娱乐软件
  • 18. 应用软件
  • 19. 教学软件
  • 20. 教学软件
  • 21. 三维图形显示
  • 22. 三维图形显示
  • 23. 二维图形显示
  • 24. 游戏软件
  • 25. 如何安装Qt开发平台?
  • 26. Qt安装过程Windows系统安装,一键安装,方便快捷!
  • 27. Qt安装过程
  • 28. Qt安装过程
  • 29. Qt安装过程
  • 30. Qt安装过程
  • 31. 如何在Qt平台下 开发应用程序?
  • 32. Qt程序开发基础打开应用软件新建工程选择开发环境创建自命名的应用程序
  • 33. 练习一个!
  • 34. C语言基础知识
  • 35. 数据类型
  • 36. C语言数据类型整型 100,125,-100,0 实型 3.14 , 0.125,-3.789 字符型 ‘a’, ‘b’,‘2’ 字符串 ‘a’, ‘ab’,‘1232’
  • 37. 变量变量与数据类型相关,设置什么类型的变量,就需要在使用时候付给什么类型的数值。 例如: int add1 = 1; double pi = 3.1415926; char ch1 = ‘a’; Bool flag = 0;
  • 38. C语言基础C语言是国际上广泛流行的高级语言 #include void main( ) { printf ("This is a C program.\n"); }说明: main-主函数名, void-函数类型 每个C程序必须有一个主函数main { }是函数开始和结束的标志,不可省 每个C语句以分号结束 使用标准库函数时应在程序开头一行写: #include
  • 39. C语言基础例 求两数之和 #include void main( ) /*求两数之和*/ { int a,b,sum; /*声明,定义变量为整型*/ /*以下3行为C语句 */ a=123; b=456; sum=a+b; printf(″sum is %d\n″,sum); }说明: /*……*/表示注释。注释只是给人看的,对编译和运行不起作用。所以可以用汉字或英文字符表示,可以出现在一行中的最右侧,也可以单独成为一行。
  • 40. C语言基础常用语句:赋值语句、循环语句、判断语句
  • 41. C语言介绍C语言特点: (1)语言简洁、紧凑、使用方便 (2)丰富的运算符和数据类型 (3)直接访问内存,进行位操作,胜任操作系统的开发 (4)生成的目标代码质量高,程序运行效率好 (5)可移植性好 C语言局限: 没有支持代码重用的语言结构 程序达到一定规模时,程序员难以控制程序的复杂性。
  • 42. C++简介C++是C的改进与扩充 C++包括C的全部属性、特征、优点,是在C的基础上的改进与扩充 C++是C语言改进的基础上,添加了对面向对象程序设计部分的支持 C++包括过程性语言和类部分 C++是C的超集,C是C++的子集 C++是混合型语言,即是过程型的,又是面向对象型的
  • 43. C语言与C++区别C语言是一种面向过程的编程语言 C语言主要用于实现小型程序 面向过程是面向对象的基础C++是面向对象的编程语言 C++通常用于实现大型程序 面向对象会大大方便编程人员,较少重复性的工作
  • 44. 第一讲到此结束!
  • 45. 第二讲 C++基础及Qt实战!
  • 46. C++语言基础类是一种可以作为交易的概念代码.类是自定义的数据类型.类与应用程序不同,类的功能虽然独立,但不能独立启动,就象汽车零件那样. 类机制 要通过编程的方法来维护类的数据表达,值范围和操作并不是简单的,因为要限制一些操作只能让类自己来做,以免发生问题时,无人敢对其负责.   类机制就是通过语言的规定性来实现一些技术,使类具有数据封装,信息屏蔽,多态等特征,起到数据类型的作用,而达到方便编程的目的.
  • 47. C++语言基础C++提供了一种类class机制,不但可以定义数据的复合,还可以定义该复合数据的操作,将工作分为工作目标和内容,从而便于编程。 类机制定义类class,类是一种类型type,定义类的格式与struct相像,只是在定义体中添上操作,操作是一个个的功能,由函数形式表示。
  • 48. C++语言基础面向对象程序设计 —— Object-Oriented Programming自行车对象数据抽象自行车类属性:架子尺寸 车轮尺寸 颜色 原材料 操作:转弯 移动 修理
  • 49. C++语言基础面向对象程序设计将数据及对数据的操作放在一起,作为一个相互依存,不可分割的整体来处理,即对象。 它采用数据抽象和信息隐藏技术。 它将对象及对象的操作抽象成一种新的数据类型——类,并且考虑不同对象之间的联系和对象类的重要性。
  • 50. C++语言基础//类的定义 class 类名 { 私有的数据和成员函数; private: 私有的数据和成员函数; public: 公有的数据和成员函数; protected: 保护的数据和成员函数; };
  • 51. C++语言基础1.) public members : 被定义为public members 的成员函数及 成员变量 , 可在任何的函数中被使用 . 包括main函数,及其它非成员函数.
  • 52. C++语言基础2.) private members : 被定义为private members 的成员函数及成员变量 , 只能在成员函数中被使用 . 3) protected members: 被保护的成员函数及成员变量,Qt中会使用的成员变量,是一种特使应用下的成员函数及变量。
  • 53. C++语言基础class Date{ int year, month, day; public: void set(int y,int m,int d); // 赋值操作 bool isLeapYear(); // 判断闰年 void print(); // 输出日期 };
  • 54. 除了将关键字struct换成class外,其定义体中,既含有用整型表示的复合年、月、日数据,它们是类的数据组成部分,所以被称为数据成员,也含有对年、月、日的操作,有设置年、月、日的set操作,有判断是否闰年的isLeapYear操作,还有显示日期的print操作,它们都是函数声明的形式,由一个关键字public引导,表示这些操作可以提供给外界公用,因为这些操作从属于一个类,所以是类的成员,这些操作称为成员函数。
  • 55. //成员变量、成员函数 //构造函数 class complex { public: float real, image; complex(float r, float i) { real = r; image = i; }; complex( ){ }; complex& Add(complex& x, complex& y); };
  • 56. 成员函数在类外部定义时,在函数名称前应加上日期类型名前缀Date和名空间引导符“::”,它表示着自己属于某一个名空间(类),与普通函数相区别。 成员函数在类外部定义时,在函数名称前应加上日期类型名前缀Date和名空间引导符“::”,它表示着自己属于某一个名空间(类),与普通函数相区别。
  • 57. 成员函数与普通函数的区别: 成员函数属于类, 成员函数定义是类设计的一部分, 其作用域是类作用域. 而普通函数一般为全局函数 成员函数的操作主体是对象,使用时通过捆绑对象来行使其职责, 而普通函数被调用时没有操作主体
  • 58. //成员变量、成员函数 //构造函数 class complex { public: float real, image; complex(float r, float i) { real = r; image = i; }; complex( ){ }; complex& Add(complex& x, complex& y); };
  • 59. //构造函数、析构函数 class list { public: int len; int listsize; int *data; list( ){data = new int[80]; } ~list( ){delete [] data;} int resize(int s); //当存储空间不足时增加 };
  • 60. 函数定义体的花括号对的后面是没有分号的,而类定义体的花括号对的后面是有分号的。原因是因为class机制是自定义类型的机制,是在struct的语法基础上改建的,必须和struct对应,所以存在着分号。
  • 61. 类定义作用域: 从类定义结束开始,到从外面包围类定义的块结束(若类定义外无包围块,则结束于文件) 使用类的程序员在类定义作用域下编程 类定义作用域为包含类定义的花括号语句块,如果没有花括号语句块,则为从类定义开始的全部代码空间,如:
  • 62. class A(){ //… }; //A类定义作用域 void f(){ class B{ //… };//B类定义作用域范围 }//B类定义作用域到此为止 //文件到此为止(A类定义作用域到此为止)
  • 63. 类作用域: 类定义内部及成员函数定义内部 实现类的程序员在类作用域下编程 类作用域中,类的成员函数对数据成员和其他成员函数具有无限制的访问权。
  • 64. 函数函数是一种关系,这种关系使一个集合里的每一个元素对应到另一个(可能相同的)集合里的唯一元素。 在C语言里,可将函数定义为可以实现相关功能的程序模块。
  • 65. 函数举例一个简单的函数 Int FunforAdd(int a,int b) { int c = a+b; return c; }
  • 66. C++算法算法是程序的灵魂! 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
  • 67. 算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。
  • 68. 算法应该具有的特点1、有穷性(Finiteness) 算法的有穷性是指算法必须能在执行有限个步骤之后终止 2、确切性(Definiteness) 算法的每一步骤必须有确切的定义; 3、输入项(Input) 一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件; 4、输出项(Output)
  • 69. 一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的; 5、可行性(Effectiveness) 算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性); 6、 高效性(High efficiency) 执行速度快,占用资源少; 7、 健壮性(Robustness) 对数据响应正确。
  • 70. 试着构想如下问题的算法计算1+2+3+4+5+…+1000 计算1+2+3+…任意值 计算1/1+1/2+1/3+1/4+…+1/100 找出100个数字中的最大数,数据源data[100] 计算从2000年1月1日0时到任意一天中间有多少天?
  • 71. Qt实战编写一个能够实现加减乘除计算的Qt应用程序。
  • 72. 第二讲到此结束!
  • 73. 第三讲 Qt实战
  • 74. Qt工程创建创建工程同样可以创建工程
  • 75. 选择工程类型基于C++开发的工程Qt图形界面应用工程
  • 76. 定义工程路径该名称不是工程名称,只是文件夹名称工程文件夹路径
  • 77. 工程名称及类型类名称,也是工程名基于什么类创建将根据定义的工程名自动改
  • 78. Qt实战新建一个Qt工程,可看到生成了以下几个文件:*.pro,*.ui,*.h,*.cpp,main.cpp。
  • 79. Main文件Main文件,程序执行的入口文件,如设置自动生成ui窗口,则main文件中包含该窗口的现实过程,并可对窗口进行设置。如设置窗口大小,设置窗口最大化最小化控件等。
  • 80. Main文件首先定义了一个应用程序的实例a(application的缩写),然后定义窗口,显示窗口,进入事件循环。int main(int argc, char *argv[]) { QApplication a(argc, argv); clock w; w.show(); return a.exec(); }
  • 81. *.h文件工程文件的头文件,首先声明并定义了头文件,其格式为:#ifndef CLOCK_H #define CLOCK_H …… #endif头文件中要定义文件类,如下所示:namespace Ui { class clock; }
  • 82. *.h文件Q_OBJECT为程序必须包含的一个宏,该宏表示如果在你的程序中用到信号和槽机制,或者用到国际化等方面的应用,则必须用到这个宏。同时,该宏必须在该类下声明。即:class clock : public QDialog { Q_OBJECT };
  • 83. *.h文件头文件中还必须包含程序构造函数以及析构函数的声明,用来对程序运行和退出进行操作。 class clock : public QDialog { public: explicit clock(QWidget *parent = 0); ~clock(); private: Ui::clock *ui; };
  • 84. *.cpp文件Cpp文件是程序中函数的具体实现过程的函数。其默认的部分包括以下几部分: 包含头工程头文件及ui头文件 #include "clock.h" #include "ui_clock.h"
  • 85. *.cpp文件构造函数及析构函数clock::clock(QWidget *parent) : QDialog(parent), ui(new Ui::clock) { ui->setupUi(this); } clock::~clock() { delete ui; }
  • 86. 开始工程实现
  • 87. Qt算法实战篇请利用前两次课的知识,基于Qt编写以下两个程序,了解开发一个Qt应用程序的基本步骤 1、编写一个乘法计算器,要求能够输入任意两个数(整型或浮点型),能够计算出两数相乘的结果。 2、找出1到10000以内能被n整除且不能被m整除的所有整数个数。(n和m可通过窗口自行设定,即输入设定)
  • 88. Qt绘图Qt通过Qpainter类实现绘图功能,通过绘图事件paingEvent完成具体绘图操作。如下函数所示:void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawLine(0,0,100,100); }
  • 89. Qt二维绘图Qt提供了大量方便的绘图功能,如绘制直线,方框,半圆,椭圆等图形。The QPainter class performs low-level painting on widgets and other paint devices. QPainter provides highly optimized functions to do most of the drawing GUI programs require. It can draw everything from simple lines to complex shapes like pies and chords. It can also draw aligned text and pixmaps. Normally, it draws in a "natural" coordinate system, but it can also do view and world transformation. QPainter can operate on any object that inherits the QPaintDevice class.
  • 90. The common use of QPainter is inside a widget's paint event: Construct and customize (e.g. set the pen or the brush) the painter. Then draw. Remember to destroy the QPainter object after drawing. For example:void SimpleExampleWidget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setPen(Qt::blue); painter.setFont(QFont("Arial", 30)); painter.drawText(rect(), Qt::AlignCenter, "Qt"); }
  • 91. 绘制直线和圆创建QPainter 类对象,用其实现绘图操作 QPainter painter(this); painter.drawLine(0,0,100,100); 绘制一条直线,其中的参数为线的起点(0,0),和终点(100,100)。这里的数值指的是像素。 QPainter paint(this); paint.drawEllipse(100,100,50,50); 绘制一个以(100,100)为中心50为半径的圆
  • 92. Qt二维绘图
  • 93. Qt绘图坐标系介绍Qt绘图界面中,坐标系是一种自然坐标系,其原点在界面左上角,x轴为横向,y轴为纵向。 然而,对我们绘图而言,我们希望坐标系为平常见到的坐标系,所以需要进行坐标系平移。 paint.translate(100,100);
  • 94. 在坐标系下设置表针经过平移后的坐标系只是改变了坐标原点,x轴和y轴指向不发生改变,在该坐标系下进行绘制钟表图形,首先要设计钟表形状,钟表指针形状。通过直线表征时针,分针和秒针
  • 95. 绘制的时钟指针太难看了!!! 有木有? 有木有?
  • 96. 多边形绘图操作表针的样子???
  • 97. 设计指针利用多边形绘图操作设计指针 QPoint(0,-100), QPoint(3,0), QPoint(0,20), QPoint(-3,0)
  • 98. 绘制表盘表盘形状,圆形?方形?任意形状!
  • 99. 绘制刻度坐标旋转 刻度绘制 显示当前时间 表针动起来
  • 100. 第四讲 Qt界面优化
  • 101. 任何一个程序都离不开包装,作为给别人使用的应用程序,尤其要注意程序的人性化。 请问,上一个程序存在哪些问题?哪些地方可以改进?
  • 102. 时钟表针存在锯齿 颜色过于单一 应用程序名称不好 应用程序没有图标 应用程序如何在没有Qt的电脑上运行 程序窗口未固定 只有刻度,没有数字 数字的字体颜色等 添加数字时钟,显示日期及时间
  • 103. 课程考核方式: 每人上交一份软件作品,可以是电子时钟,也可以是其他的,同时,对作品实现的功能及自己的创意进行说明,以word格式提交,参考格式可拷贝。下次上课时作为考核方式提交,将根据作品的创意及可实现性打分。
  • 104. ALL END THANK YOU!