Qt的简单案例--加法计算器(详细代码注释)

一、项目结构

二、项目代码

widget.h

 #ifndef WIDGET_H
#define WIDGET_H
//预编译指令, 为了避免头文件被重复包含: 如果WIDGET_H没有被定义, 那么把WIDGET_H这个词替换为空; 一直到下面#endif结束预编译 #include <QWidget>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel> class Widget : public QWidget //子类Widget公有地继承于父类Widget
{
Q_OBJECT //Q_OBJECT宏的作用是启动Qt元对象系统的一些特性(如支持信号和槽等); 对于要定义信号和槽的类, 类定义的类体的开头必须写上Q_OBJECT宏, 并且它必须放置到类定义的私有区 public:
Widget(QWidget *parent = ); //子类Widget的构造函数, 参数是一个QWidget类指针,代表它的父窗口部件(parent)。为了生成一个顶层窗口,你应该指定一个空指针作为父窗口部件(parent)。
~Widget(); //下面声明我们即将创建的用户界面中会用到的控件,因为这些控件不需要继承, 也不需要在类外被访问访问,所以我们定义它们Widget子类的私有成员
private:
QPushButton *btn1; //记得包含相关头文件
QLineEdit *edit1, *edit2; //记得包含相关头文件
QLabel *label1; //记得包含相关头文件
//上面的控件都会在本项目中的widget.cpp的构造函数Widget::Widget(QWidget *parent = 0)中实例化
//下面声明要用到的槽函数
private slots:
void add();
}; #endif // WIDGET_H

main.cpp

 #include "widget.h" //子类Widget的定义了我们要创建的程序中需要完成的功能,在Widget类中封装完了这些功能。"widget.h"不是Qt的库文件, 而是我们创建一个Qt GUI应用时, Qt为我们建立的(当然, 我们也可以自己创建这样一个头文件)
#include <QApplication> //Application 类的定义。在每一个使用Qt 图形化应用程序中都必须使用一个QApplication 对象。QApplication 管理了各种各样的图形化应用程序的广泛资源、基本设置、控制流及事件处理等 int main(int argc, char *argv[]) //应用程序的入口,几乎在所有使用Qt的情况下,在将控制转交给Qt库之前, main()函数只需要执行初始化,然后Qt库通过事件(event)向程序告知用户的行为。所有Qt 程序中都必须有且只有一个main()函数。main()函数有两个参数argc 和argv , argc 是命令行变量的个数,argv是命令行变量的数组。
{
QApplication a(argc, argv); //a 是这个程序的QApplication 对象。在任何Qt的窗口系统部件被使用之前, 我们创建QApplication 对象都是必须的。它在这里被创建并且处理这些命令行变量。所有被Qt 识别的命令行参数都将从argv 中被移去(并且argc也因此而减少)
Widget w; //创建一个Widget类对象,在该类中完成我们创建的程序的各种功能
w.show(); //当创建一个窗口部件的时候,默认它是不可见的,必须调用showO函数使它变为可见 return a.exec();
//这一句相当于:
//int result = a.exec(); return result;
//exec()函数的作用是通过main()把控制(control)转交给Qt,进入程序的"消息循环(message loop)"状态,等待可能的菜单,工具条,鼠标等的输入, 然后进行响应, 直到exit() 函数被调用来结束程序。此时exec()函数的值会返回.(Returns the value that was set to exit() (which is 0 if exit() is called via quit())
//如果写return 0;程序就直接退出了,不能达到显示的效果。通过exec(),Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。
//※ 控制: 确定数据处理系统中不同部件执行输入、处理、存储和输出操作 的执行时间和顺序。
//※ 所谓“消息循环”,实际是程序循环。即Windows 中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能创建的各种窗口的消息。应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。
}

widget.cpp

 #include "widget.h"
#include <QGridLayout> Widget::Widget(QWidget *parent)
: QWidget(parent) //初始化列表, 在子类中调用父类构造函数, parent的值(默认为0)传给了QWidget()构造函数; 这是为了创建一个新的窗体, 这个窗体是一个顶层窗体(因为QWidget()构造函数的第一个形参代表父窗口, 如果对应的形参为0, 则代表生成一个父窗口)
{
btn1 = new QPushButton(this); //动态子对象btn1通过QPushButton类的构造函数创建
//创建子控件对象时, 需指定其parent对象.
//Qt的对象模型提供了一种Qt对象之间的父子关系,当很多个对象都按一定次序建立起来这种父子关系的时候,就组织成了一颗树。
//当delete一个父对象的时候,Qt的对象模型机制保证了会自动的把它的所有子对象,以及孙对象,等等,全部delete,从而保证不会有内存泄漏的情况发生。
// 具体来说, 在每一个Qt对象中,都有一个链表,这个链表保存有它所有子对象的指针。
//当创建一个新的Qt对象的时候,如果把另外一个Qt对象指定为这个对象的父对象, 那么父对象就会在它的子对象链表中加入这个子对象的指针。另外,对于任意一个Qt对象而言,在其生命周期的任何时候,都还可以通过setParent函数 重新设置它的父对象。当一个父对象在被delete的时候,它会自动的把它所有的子对象全部delete。当一个子对象在delete的时候,会把它自己 从它的父对象的子对象链表中删除。
//※ 唯有我们使用new创建的没有父对象的对象才需要我们调用delete来释放。
//QPushButton类的构造函数为: QPushButton::QPushButton ( QWidget * parent, const char * name = 0 ),
//我们看到, parent的类型为QWidget, 但this的类型为Widget, 这就说明, 父类指针形参(QWidget*)可以接受其子类指针实参(Widget*)
edit1 = new QLineEdit(this);
edit2 = new QLineEdit(this);
label1 = new QLabel(this); //上面都是在子类Widget的构造函数里面创建控件(即"动态对象"作"成员对象")
label1->setText("label1"); //setText()是对象label1的成员函数; 记得包含相关头文件
btn1->setText("Get sum");
QGridLayout *layout = new QGridLayout(this); //建立一个布局(layout), 这个布局是一个动态对象
layout->addWidget(edit1, , );
layout->addWidget(edit2, , );
layout->addWidget(btn1, , );
layout->addWidget(label1, , ); //上面的layout对象的addWidget()成员函数用于在布局中插入控件
connect(btn1, SIGNAL(clicked()), this,SLOT(add()));//将btn1的点击事件和add函数关联
//connect函数语法如下:
//connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
//sender和receiver是QObject对象指针,signal 和 slot 函数一定要有形参类型(除非像这里clicked()和add()函数一样本身就没有形参), 但是,不可以有形参名。SIGNALE()和SLOT()宏的作用是把他们的参数转换成字符串。
//如果要确定"SIGNAL(signal())"中的signal()是什么, 我们首先需要确定对象sender所属的类型是什么, 然后去Qt文档里面查这种类型可以有哪些signals
} Widget::~Widget()
{ } void Widget::add() //实现槽函数
{
QString s1 = edit1->text();//得到在edit1控件中用户输入的字符
QString s2 = edit2->text();
int a = s1.toInt() + s2.toInt();
label1->setText(QString::number(a)); }

三、项目效果

Qt简单项目--加法计算器(详细代码注释)的更多相关文章

  1. opencv 之 icvCreateHidHaarClassifierCascade 分类器信息初始化函数部分详细代码注释。

    请看注释.这个函数,是人脸识别主函数,里面出现过的函数之一,作用是初始化分类器的数据,就是一个xml文件的数据初始化. static CvHidHaarClassifierCascade* icvCr ...

  2. 从开源项目看python代码注释

    最近看了不少代码,也写了不少代码,所以在看和写之间发现了很多的问题,真的是很多,至少从我的认识来看,有几个地方有很大的改进空间,这里不准备把所有的问题都列举出来,所以就先挑选一个比较明显得来和大家聊聊 ...

  3. ExcelToHtmlTable转换算法:将Excel转换成Html表格并展示(项目源码+详细注释+项目截图)

    功能概述 Excel2HtmlTable的主要功能就是把Excel的内容以表格的方式,展现在页面中.Excel的多个Sheet对应页面的多个Tab选项卡.转换算法的难点在于,如何处理行列合并,将Exc ...

  4. 使用qt制作简单的加法,乘法运算。

    1.首先构架qt应用项目 2.然后打开使用 Qt desinger打开 Fomr File 里的UI文件进行编辑 3.由于此程序只需点击加号,减号这两个按钮,所以设置了两个信号槽 4.然后是连接信号槽 ...

  5. qt简单界面更新代码(菜鸟级)(部分代码)

    qt简单界面更新代码(菜鸟级)(部分代码)self.timers_1=QtCore.QTimer(self)self.timers_1.timeout.connect(self.min_1)self. ...

  6. Qt绘制简单的风向玫瑰图代码

    1.绘制简单的风向玫瑰图代码2.主要使用QPainter3.在子widget上绘制需要使用widget监视事件 eventfilter update();//更新界面 //镜头12 QPainter ...

  7. tensorflow笔记:流程,概念和简单代码注释

    tensorflow是google在2015年开源的深度学习框架,可以很方便的检验算法效果.这两天看了看官方的tutorial,极客学院的文档,以及综合tensorflow的源码,把自己的心得整理了一 ...

  8. Java项目案例之---加法计算器(转发和重定向)

    加法计算器(转发和重定向) 运行显示: 转发 重定向 代码: index.jsp <%-- Created by IntelliJ IDEA. User: Administrator Date: ...

  9. TERSUS无代码开发(笔记02)-简单实例加法

    简单实例加法 1.用户端元件(显示元件)(40个) 图标 英文名称 元件名称 使用说明 服务器端 客户端 Pane 显示块 是一个显示块,是HTML的div标签   √ Row 行 行元件中的显示元件 ...

随机推荐

  1. 子序列的按位或 Bitwise ORs of Subarrays

    2018-09-23 19:05:20 问题描述: 问题求解: 显然的是暴力的遍历所有的区间是不可取的,因为这样的时间复杂度为n^2级别的,对于规模在50000左右的输入会TLE. 然而,最后的解答也 ...

  2. learn python the hard way 习题6~10总结

    习题6总结 定义字符串: 名字 = 值 其他 你也可以用 {types_of_people}的方式把它放在任何字符串中. 也就是说你可以在其他字符串中添加{},然后前面加一个 f,可用print()进 ...

  3. HTML 第十二章总结

    HTML5 markup 前言 在这一章中,讲解了新的 HTML5 的一些 markup,并且对其中的<video>进行了很详细的讲解. New HTML5 elements 列表如下: ...

  4. java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration

    java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration 最近在做项目的时候遇到了这个问题,很是困扰,多次尝试后发现是jar包的问 ...

  5. LeetCode--371--两整数之和

    问题描述: 方法: class Solution(object): def getSum(self, a, b): """ :type a: int :type b: i ...

  6. Vmware安装Kali

    下载软件 破解版的Vmware14 kali(我的是kali-linux-2018.2-amd64) 配置虚拟机 新建虚拟机,选择自定义 虚拟机硬件兼容性 选择虚拟机硬件兼容性为Workstation ...

  7. JQ 实现监测input中值的变化并绑定到另个input

                    $('#input').bind('input propertychange', function () {                     $('#myDiv ...

  8. LeetCode 958. 二叉树的完全性检验

    958. 二叉树的完全性检验  显示英文描述 我的提交返回竞赛   用户通过次数119 用户尝试次数157 通过次数123 提交次数378 题目难度Medium 给定一个二叉树,确定它是否是一个完全二 ...

  9. WDA基础五:ALV组件的使用

    说明,因为ALV的功能比TABLE强大,所以在很多时候都习惯性的选择ALV显示. ALV是WDA的组件,封装好的,和SELECT OPTION一样.所以使用的方法一般就是:引入组件,初始化组件,数据绑 ...

  10. Hadoop介绍-4.Hadoop中NameNode、DataNode、Secondary、NameNode、JobTracker TaskTracker

    Hadoop是一个能够对大量数据进行分布式处理的软体框架,实现了Google的MapReduce编程模型和框架,能够把应用程式分割成许多的 小的工作单元,并把这些单元放到任何集群节点上执行.在MapR ...