前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >QT(二).计算器(2)

QT(二).计算器(2)

作者头像
franket
发布2021-09-14 14:12:55
9920
发布2021-09-14 14:12:55
举报
文章被收录于专栏:技术杂记

从中可知,这是一个冗长的 XML 文件

内容是在描述窗体与各个控件的参数

Qt 就是通过这些参数来绘制图形的

代码示例

main.cpp

代码语言:javascript
复制
#include <QtGui/QApplication> //QApplication 类管理图形用户界面应用程序的控制流和主要设置
#include <QtCore/QTextCodec> //用来进行字符集转化
#include "calc.h" 

int main(int argc, char** argv) 
{
	QApplication app(argc, argv); //构建一个 QApplication 对象 app,这个操作整个运行期间有且只能有一次,并且要在所有其它组件生成之前构建
	QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")) ; //设定要转化的字符集为UTF-8,但是在Qt内部,其实还是使用的Unicode进行存储
	app.setFont(QFont("simsun", 10)); //设定字体

	Calc c; //定义一个Calc类对象,这个类在calc.h有详细声明
        c.show(); //调用show方法,这个方法继承于QWidget,QWidget::show ,Shows the widget and its child widgets. This function is equivalent to setVisible(true).

	return app.exec(); //进入主事件循环,这是应用逻辑的进入点
}

calc.h

代码语言:javascript
复制
#ifndef CALC_H //这个条件编译是一种很好的编程习惯,加强了代码的健壮性,在大项目中可以有效避免冲突
#define CALC_H  


#include <QWidget>  //QWidget类是所有UI对象的基类
#include <QDialog>  //QDialog对象一般是最顶层的窗口

#include "ui_calc.h" //ui头文件

class Calc: public QDialog, public Ui_Calc //继承自QDialog 和 Ui_Calc , Ui_Calc 是从哪里来的呢,这个后面交代
{
	Q_OBJECT //这个宏不可或缺,否则这个类无法使用QT中的signal和slot机制
public:
	Calc(QWidget *parent = 0); //构造函数
	~Calc(); //析构函数

signals:
	
public slots:
	void append1();
	void append2();
	void append3();
	void append4();
	void append5();
	void append6();
	void append7();
	void append8();
	void append9();
	void append0();
	void appendP();
	void clear();
	void del();
	void add();
	void eq();
	void min();
	void div();
	void mul();
	void mod(); //定义的各种slots函数,以便触发后产生相应操作
	
private:

};

#endif

calc.cpp

代码语言:javascript
复制
#include <stdio.h> //printf 的声明在此
#include "calc.h"  //这个文件中包含了Calc类的定义

QString res("");  //定义一个res的QString来存放结果
float a=1,b=1,r=0; //临时值的存放处
char c='\0'; //操作符的存放处,作为全局是为了方便共享

Calc::Calc(QWidget *parent):QDialog(parent) //构造函数的实现,parent = 0 为默认值,代表这是一个新的窗口
{
  setupUi(this);  //这个函数是Ui_Calc类的一个内联函数,用来设置自身的界面布局和组件分布,还有组件和窗口的形状大小和位置,参数信息来源于之前使用designer生成的XML文件calc.ui
  
  le->setText(res); //将le的内容设置为res,此时为“”
  le->setAlignment(Qt::AlignRight); //将le的显示设定为右对齐
  
  connect(pb1,SIGNAL(clicked()),this,SLOT(append1()));
  connect(pb2,SIGNAL(clicked()),this,SLOT(append2()));
  connect(pb3,SIGNAL(clicked()),this,SLOT(append3()));
  connect(pb4,SIGNAL(clicked()),this,SLOT(append4()));
  connect(pb5,SIGNAL(clicked()),this,SLOT(append5()));
  connect(pb6,SIGNAL(clicked()),this,SLOT(append6()));
  connect(pb7,SIGNAL(clicked()),this,SLOT(append7()));
  connect(pb8,SIGNAL(clicked()),this,SLOT(append8()));
  connect(pb9,SIGNAL(clicked()),this,SLOT(append9()));
  connect(pb0,SIGNAL(clicked()),this,SLOT(append0()));
  connect(pbPoint,SIGNAL(clicked()),this,SLOT(appendP()));
  connect(pbC,SIGNAL(clicked()),this,SLOT(clear()));
  connect(pbD,SIGNAL(clicked()),this,SLOT(del()));
  connect(pbAdd,SIGNAL(clicked()),this,SLOT(add()));
  connect(pbEq,SIGNAL(clicked()),this,SLOT(eq()));
  connect(pbMin,SIGNAL(clicked()),this,SLOT(min()));
  connect(pbMul,SIGNAL(clicked()),this,SLOT(mul()));
  connect(pbDiv,SIGNAL(clicked()),this,SLOT(div()));
  connect(pbMod,SIGNAL(clicked()),this,SLOT(mod())); //使用信号槽的机制将各种对象的点击事件(signal)与处理过程(slot函数)绑定起来
}

Calc::~Calc()
{

}

void Calc::eq() //等号操作函数实现
{
  b=res.toFloat(); //将临时结果进行保存
  if ('+' == c) r=a+b;
  else if  ('-' == c) r=a-b;
  else if  ('x' == c) r=a*b;
  else if  ('/' == c) r=a/b;
  else if  ('%' == c) r=(int)a % (int)b;
  else r=b; //根据操作符的类别进行相应计算
  printf("%f %c %f = %f\n",a,c,b,r); //在终端上进行日志打印,也可以选择不要此步骤
  lbOp->setText(QString("=")); //将操作符标签改为等号
  res=QString::number(r);  //将r的值转化为QString对象赋值给res
  le->setText(res); //将结果显示出来 
  res=QString("");  //清空暂存的内容
}

void Calc::add()  //加法操作函数实现
{
  a=res.toFloat(); 
  c='+';
  lbOp->setText(QString("+"));
  res=QString("");  
  le->setText(res);
}

void Calc::min() //减法操作函数实现
{
  a=res.toFloat();
  c='-';
  lbOp->setText(QString("-"));
  res=QString("");
  le->setText(res);
}

void Calc::mul() //乘法操作函数实现
{
  a=res.toFloat();
  c='x';
  lbOp->setText(QString("x"));
  res=QString("");
  le->setText(res);
}

void Calc::div() //除法操作函数实现
{
  a=res.toFloat();
  c='/';
  lbOp->setText(QString("/"));
  res=QString("");  
  le->setText(res);
}

void Calc::mod() //取模操作函数实现
{
  a=res.toFloat();
  c='%';
  lbOp->setText(QString("%"));
  res=QString("");  
  le->setText(res);
}

void Calc::del()  //删除一个字符
{
  res.chop(1); 
  le->setText(res);
}

void Calc::clear() //清空内容
{
  res=QString("");
  le->setText(res);
}

void Calc::appendP() //输入小数点
{
  res.append(".");
  le->setText(res);
}

void Calc::append1() //输入1
{
  res.append("1");
  le->setText(res);
}

void Calc::append2() //输入2
{
  res.append("2");
  le->setText(res);
}

void Calc::append3()  //输入3
{
  res.append("3");
  le->setText(res);
}

void Calc::append4() //输入4
{
  res.append("4");
  le->setText(res);
}

void Calc::append5() //输入5
{
  res.append("5");
  le->setText(res);
}

void Calc::append6() //输入6
{
  res.append("6");
  le->setText(res);
}

void Calc::append7() //输入7
{
  res.append("7");
  le->setText(res);
}

void Calc::append8() //输入8
{
  res.append("8");
  le->setText(res);
}

void Calc::append9() //输入9
{
  res.append("9");
  le->setText(res);
}

void Calc::append0() //输入0
{
  res.append("0");
  le->setText(res);
}

编译执行

代码语言:javascript
复制
[emacs@h102 calc]$ ls
calc.cpp  calc.h  calc.ui  main.cpp
[emacs@h102 calc]$ alias gtt
alias gtt='qmake -project ; qmake ; make'
[emacs@h102 calc]$ qmake -project
[emacs@h102 calc]$ qmake 
[emacs@h102 calc]$ make
/usr/local/Trolltech/Qt-4.8.6/bin/uic calc.ui -o ui_calc.h
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.8.6/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.8.6/include/QtCore -I/usr/local/Trolltech/Qt-4.8.6/include/QtGui -I/usr/local/Trolltech/Qt-4.8.6/include -I. -I. -I. -o calc.o calc.cpp
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.8.6/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.8.6/include/QtCore -I/usr/local/Trolltech/Qt-4.8.6/include/QtGui -I/usr/local/Trolltech/Qt-4.8.6/include -I. -I. -I. -o main.o main.cpp
/usr/local/Trolltech/Qt-4.8.6/bin/moc -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.8.6/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.8.6/include/QtCore -I/usr/local/Trolltech/Qt-4.8.6/include/QtGui -I/usr/local/Trolltech/Qt-4.8.6/include -I. -I. -I. calc.h -o moc_calc.cpp
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.8.6/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.8.6/include/QtCore -I/usr/local/Trolltech/Qt-4.8.6/include/QtGui -I/usr/local/Trolltech/Qt-4.8.6/include -I. -I. -I. -o moc_calc.o moc_calc.cpp
g++ -Wl,-O1 -Wl,-rpath,/usr/local/Trolltech/Qt-4.8.6/lib -o calc calc.o main.o moc_calc.o    -L/usr/local/Trolltech/Qt-4.8.6/lib -lQtGui -L/usr/local/Trolltech/Qt-4.8.6/lib -L/usr/X11R6/lib -lQtCore -lpthread 
[emacs@h102 calc]$ echo $?
0
[emacs@h102 calc]$ ls
calc      calc.h  calc.pro  main.cpp  Makefile      moc_calc.o
calc.cpp  calc.o  calc.ui   main.o    moc_calc.cpp  ui_calc.h
[emacs@h102 calc]$ ./calc 
...
...

会弹出一个小窗口

calc4.png
calc4.png

编译执行过程中没有报错,从结果来看,符合预期

进行操作检查,功能也相对完备


编译过程

从make的编译过程可以看出如下信息

代码语言:javascript
复制
[emacs@h102 calc]$ make
/usr/local/Trolltech/Qt-4.8.6/bin/uic calc.ui -o ui_calc.h
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.8.6/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.8.6/include/QtCore -I/usr/local/Trolltech/Qt-4.8.6/include/QtGui -I/usr/local/Trolltech/Qt-4.8.6/include -I. -I. -I. -o calc.o calc.cpp
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.8.6/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.8.6/include/QtCore -I/usr/local/Trolltech/Qt-4.8.6/include/QtGui -I/usr/local/Trolltech/Qt-4.8.6/include -I. -I. -I. -o main.o main.cpp
/usr/local/Trolltech/Qt-4.8.6/bin/moc -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.8.6/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.8.6/include/QtCore -I/usr/local/Trolltech/Qt-4.8.6/include/QtGui -I/usr/local/Trolltech/Qt-4.8.6/include -I. -I. -I. calc.h -o moc_calc.cpp
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.8.6/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.8.6/include/QtCore -I/usr/local/Trolltech/Qt-4.8.6/include/QtGui -I/usr/local/Trolltech/Qt-4.8.6/include -I. -I. -I. -o moc_calc.o moc_calc.cpp
g++ -Wl,-O1 -Wl,-rpath,/usr/local/Trolltech/Qt-4.8.6/lib -o calc calc.o main.o moc_calc.o    -L/usr/local/Trolltech/Qt-4.8.6/lib -lQtGui -L/usr/local/Trolltech/Qt-4.8.6/lib -L/usr/X11R6/lib -lQtCore -lpthread 
[emacs@h102 calc]$
  • 1.uic : calc.ui->ui_calc.h
  • 2.g++ : calc.cpp->calc.o
  • 3.g++ : main.cpp->main.o
  • 4.moc : calc.h->moc_calc.cpp
  • 5.g++ : moc_calc.cpp->moc_calc.o
  • 6.g++ : calc.o main.o moc_calc.o ->calc

生成关系

相互之间的生成关系为

代码语言:javascript
复制
calc.ui->ui_calc.h
calc.cpp->calc.o------------------|
main.cpp->main.o------------------|->calc
calc.h->moc_calc.cpp->moc_calc.o--|

依赖关系

从源码中的依赖关系可知

代码语言:javascript
复制
[emacs@h102 calc]$ grep include main.cpp 
#include <QtGui/QApplication>
#include <QtCore/QTextCodec>
#include "calc.h"
[emacs@h102 calc]$ grep include calc.cpp 
#include <stdio.h>
#include "calc.h"
[emacs@h102 calc]$ grep include calc.h 
#include <QDialog>
#include <QWidget>
#include "ui_calc.h"
[emacs@h102 calc]$

相互之间的依存关系为

代码语言:javascript
复制
calc.ui-[uic]->ui_calc.h   |->main.cpp-[g++]->main.o------------------|
                     |->calc.h-[moc]->moc_calc.cpp-[g++]->moc_calc.o--|->calc
                           |->calc.cpp-[g++]->calc.o------------------| 

*.pro 文件与 Makefile 文件的关系如下

代码语言:javascript
复制
source-[qmake -project]->*.pro-[qmake]->Makefile--|-[make]->target
    |---------------------------------------------|

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码示例
  • 编译执行
  • 编译过程
    • 生成关系
      • 依赖关系
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档