从中可知,这是一个冗长的 XML 文件
内容是在描述窗体与各个控件的参数
Qt 就是通过这些参数来绘制图形的
main.cpp
#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
#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
#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);
}
[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
...
...
会弹出一个小窗口
编译执行过程中没有报错,从结果来看,符合预期
进行操作检查,功能也相对完备
从make的编译过程可以看出如下信息
[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]$
相互之间的生成关系为
calc.ui->ui_calc.h
calc.cpp->calc.o------------------|
main.cpp->main.o------------------|->calc
calc.h->moc_calc.cpp->moc_calc.o--|
从源码中的依赖关系可知
[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]$
相互之间的依存关系为
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 文件的关系如下
source-[qmake -project]->*.pro-[qmake]->Makefile--|-[make]->target
|---------------------------------------------|
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。