subButton = newQPushButton; subButton->setText(tr(\)); mulButton = newQPushButton; mulButton->setText(tr(\)); divButton = newQPushButton; divButton->setText(tr(\)); equButton = newQPushButton; equButton->setText(tr(\));
firstLayout = newQHBoxLayout;//初始化水平布局器firstLayout
firstLayout->addWidget(zeroButton); //把按键zeroButton添加到firstLayout firstLayout->addWidget(oneButton); //把按键oneButton添加到firstLayout firstLayout->addWidget(twoButton); //把按键twoButton添加到firstLayout firstLayout->addWidget(addButton); //把按键threeButton添加到firstLayout,以下对水平布局器的操作类似
secondLayout = newQHBoxLayout; secondLayout->addWidget(threeButton); secondLayout->addWidget(fourButton); secondLayout->addWidget(fiveButton); secondLayout->addWidget(subButton);
thirdLayout = newQHBoxLayout; thirdLayout->addWidget(sixButton); thirdLayout->addWidget(sevenButton); thirdLayout->addWidget(eightButton); thirdLayout->addWidget(mulButton);
fourthLayout = newQHBoxLayout; fourthLayout->addWidget(nineButton); fourthLayout->addWidget(clearButton); fourthLayout->addWidget(equButton); fourthLayout->addWidget(divButton);
mainLayout = newQVBoxLayout(this);//初始化垂直布局器mainLayout
mainLayout->addWidget(operateEdit); //把显示数据框operateEdit加到mainLayout mainLayout->addLayout(firstLayout); //把水平布局器firstLayout添加到mainLayout mainLayout->addLayout(secondLayout); //把水平布局器secondLayout添加到mainLayout
mainLayout->addLayout(thirdLayout); //把水平布局器thirdLayout添加到mainLayout
mainLayout->addLayout(fourthLayout); //把水平布局器fourthLayout添加到mainLayout
connect(zeroButton,SIGNAL(clicked()),this,SLOT(zeroButtonPress())); //把按键zeroButton的按下事件同zeroButtonPress()绑定到一起,以下操作类似 connect(oneButton,SIGNAL(clicked()),this,SLOT(oneButtonPress())); connect(twoButton,SIGNAL(clicked()),this,SLOT(twoButtonPress())); connect(threeButton,SIGNAL(clicked()),this,SLOT(threeButtonPress())); connect(fourButton,SIGNAL(clicked()),this,SLOT(fourButtonPress())); connect(fiveButton,SIGNAL(clicked()),this,SLOT(fiveButtonPress())); connect(sixButton,SIGNAL(clicked()),this,SLOT(sixButtonPress()));
connect(sevenButton,SIGNAL(clicked()),this,SLOT(sevenButtonPress())); connect(eightButton,SIGNAL(clicked()),this,SLOT(eightButtonPress())); connect(nineButton,SIGNAL(clicked()),this,SLOT(nineButtonPress()));
connect(addButton,SIGNAL(clicked()),this,SLOT(addButtonPress())); connect(subButton,SIGNAL(clicked()),this,SLOT(subButtonPress())); connect(mulButton,SIGNAL(clicked()),this,SLOT(mulButtonPress())); connect(divButton,SIGNAL(clicked()),this,SLOT(divButtonPress())); connect(equButton,SIGNAL(clicked()),this,SLOT(equButtonPress())); connect(clearButton,SIGNAL(clicked()),this,SLOT(clearButtonPress()));
this->setWindowTitle(tr(\));//设置窗体标题为Calculator
input2= \;//初始化运算操作数2为0 input1 = \;//初始化运算操作数1为0 operate = '0';//初始化运算符为’0’ }
然后是析构函数的实现:
Calculator::~Calculator()//析构函数主要完成对构造函数中所声明的QLineEdit、QPushButton、QHBoxLayout、QVBoxLayout类的对象的回收工作(可以不定义析构函数,程序运行结束时会自动调用系统默认的析构函数) {
if (operateEdit != NULL) // { operateEdit = NULL; deleteoperateEdit; }
if (zeroButton != NULL) { zeroButton = NULL; deletezeroButton;
} ...... }
根据前面对按键事件的分析,有数字输入键,运算操作符输入键和清屏键三种,故对每种事件的槽响应函数都只说明一种,其他依此类推。
数字输入键响应槽函数,以按键“1”为例: void Calculator::oneButtonPress() {
if(input2==\)//如果当前显示框为0 {
input2=\;//变0为1 }
else//如果当前显示框不为0 {
input2= operateEdit->text();
input2.append(tr(\));//在显示的数据后面追加1 }
operateEdit->setText(input2);//更新显示框中的显示信息 }
运算操作符输入键响应槽函数,以按键“+”为例:
void Calculator::addButtonPress() {
floatfirst,second;
input2= operateEdit->text();//把当前显示的数据保存到运算操作数2中 if(operate == '0')//如果是第一次按下运算符键 {
input1 = input2;//把运算操作数2中的数据保存到运算操作数1中 input2= \;//清除运算操作数2中的数据 operate = '+';//把运算符键置’+’ }
Else//如果是第二次按下运算符键 {
second=input2.toFloat();//把运算操作数2中的数据转化为浮点类型 first=input1.toFloat();//把运算操作数1中的数据转化为浮点类型 switch(operate)//根据当前的运算符判断做何操作 {
case'+':first = first+second;break; case'-':first = first-second;break; case'*':first = first*second;break; case'/':first = first/second;break; }
input1 = QString::number(first,'f',10);//把运算的结果转化成为可以在显示框显示的类型
input2 = \;//清除运算操作数2中的数据 operate = '+';//把运算符键置“+” }
operateEdit->setText(input1);//更新显示框中的显示内容 }
清屏操作响应函数:
void Calculator::clearButtonPress() {
input2=\//把运算操作数2清零 input1=\//把运算操作数1清零
operateEdit->setText(input2); //更新显示框中的显示内容 }
3) 对main.cpp源代码的简要说明
#include
int main(intargc, char *argv[])//main函数的标准写法 {
QApplication app(argc, argv); //创建一个QApplication对象,管理应用程序的资源 Calculator mainwindow; //产生一个计算器对象
mainwindow.showMaximized();//显示计算器窗体(默认以最大化的形式显示)
return app.exec();//让程序进入消息循环,等待可能的菜单、工具条、鼠标等的输入,进行响应。 }
4. 计算器程序在X86上的编译运行
1) 完成源程序的编辑后,可以直接点击图10中所示的运行按钮,这时
QtCreator会自动编译源程序并生成可执行程序(这里默认的编译环境是X86的,生成的可执行程序可以直接在宿主机上运行)。可以在/root/Work/Calculator-build-desktop目录下找到可执行程序。
图10
2) 2)计算器程序在X86上的界面如图11所示,可以进行简单的计算来测
试此计算器的功能。
图11