项目描述
实现Windows计算器
QT 实现windows计算器
功能:
- 计算一个表达式,将它存储在右边历史记录框中
- 求一个数的二进制
- 求一个数的平方
- 退格键
- 清空历史记录和表达式框
- 将第一个数变成负数
先导知识
1. 如何实现多个按钮绑定一个槽函数?
按键0-9实现的功能都是一样,设置基本的运算符 + - * / 几乎都差不多的功能,所以我们可以将它直接绑定到一个槽函数。
connect
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->btn1,&QPushButton::clicked,this,&Widget::cal_textBox); //按钮1连接
connect(ui->btn2,&QPushButton::clicked,this,&Widget::cal_textBox); //按钮2连接
/*****************************************************
*参数:
* 发送对象(按钮) 信号(单击事件) 接收方(widget) 槽函数
******************************************************/
}
void Widget::cal_textBox(){
//senderObj 可以获取到发送者的名字
QString senderObj = this->sender()->objectName();
//qDebug()<<senderObj;
QString textbox = ui->textEdit->toPlainText();
if(senderObj=="btn1"){
textbox.append("1");
ui->textEdit->setPlainText(textbox);
}
else if(senderObj=="btn2"){
textbox.append("2");
ui->textEdit->setPlainText(textbox);
}
}
2.QString 常用函数
//转换成整型
QString ep1 = "123";
int res = ep1.toInt(); //123
//QChar 与 QString
char op;
for(QChar c:exp){ //增强for语句 QString 会把单个字符变成QChar类型
if(c=='+' || c=='-' || c=='*' || c=='/')
op = c.toLatin1(); //QChar 转换成char类型
}
//查找字符
QString exp = "123+456"
//op='+' 从下标为1处开始找 op,返回一个下标,找不到返回-1
int op_pos = exp.indexOf(op,1);
//字符串分割 截取
QString ep1;
ep1 = exp.left(op_pos); //截取op_pos个字符 就是截取到+之前
QString ep2;
ep2 = exp.mid(op_pos+1);
//删除str最后一个字符
QString str = "15*16";
str.chop(1); //15*1
str = "-156";
//删除第0位 删1个字符
str.remove(0,1); //str = 156
//将整数转换成二进制或者10进制字符串
int res = ep2.toInt(); //res = 10
// %1表示1个值 res就是值 1:一个字节 2:二进制(10就是十进制)
QString r = QString("%1").arg(res, 1, 2); //r=1010
//在textbox末尾添加1
QString textbox;
textbox.append("1");
操作ui对象的一些方法
//获取textEdit的文本信息
QString textbox = ui->textEdit->toPlainText();
//设置textEdit的文本信息
ui->textEdit->setPlainText(textbox);
//textbox="12+1" r=13 添加信息到showbox的下一行
ui->showbox->append(textbox+"="+r);
//清空信息框的东西
ui->showbox->clear();
ui界面
每个按钮的名字都要改哦
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDebug>
#include <QString>
#include <QTextCursor>
#include <QChar>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
//定义文本框的槽函数,会有多个信号连接进来
void cal_textBox();
//计算表达式结果
int cal_res(QString);
private slots:
void on_clear_clicked();
void on_del_clicked();
void on_sqr_clicked();
void on_bin_clicked();
void on_changesigned_clicked();
void on_clearmemory_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp(重点)
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->btn0,&QPushButton::clicked,this,&Widget::cal_textBox);
connect(ui->btn1,&QPushButton::clicked,this,&Widget::cal_textBox); //按钮1连接
connect(ui->btn2,&QPushButton::clicked,this,&Widget::cal_textBox); //按钮2连接
connect(ui->btn3,&QPushButton::clicked,this,&Widget::cal_textBox);
connect(ui->btn4,&QPushButton::clicked,this,&Widget::cal_textBox);
connect(ui->btn5,&QPushButton::clicked,this,&Widget::cal_textBox);
connect(ui->btn6,&QPushButton::clicked,this,&Widget::cal_textBox);
connect(ui->btn7,&QPushButton::clicked,this,&Widget::cal_textBox);
connect(ui->btn8,&QPushButton::clicked,this,&Widget::cal_textBox);
connect(ui->btn9,&QPushButton::clicked,this,&Widget::cal_textBox);
connect(ui->btnplus,&QPushButton::clicked,this,&Widget::cal_textBox); //+
connect(ui->btnsub,&QPushButton::clicked,this,&Widget::cal_textBox); //-
connect(ui->btnmul,&QPushButton::clicked,this,&Widget::cal_textBox); //*
connect(ui->btndiv,&QPushButton::clicked,this,&Widget::cal_textBox); //÷
connect(ui->equal,&QPushButton::clicked,this,&Widget::cal_textBox); //=
}
Widget::~Widget()
{
delete ui;
}
void Widget::cal_textBox(){
//senderObj 可以获取到发送者的名字
QString senderObj = this->sender()->objectName();
//qDebug()<<senderObj;
QString textbox = ui->textEdit->toPlainText();
//定义一个已有操作符
static bool have_op = false;
if(senderObj=="btn1"){
textbox.append("1");
ui->textEdit->setPlainText(textbox);
}
else if(senderObj=="btn2"){
textbox.append("2");
ui->textEdit->setPlainText(textbox);
}
else if(senderObj=="btn0"){
textbox.append("0");
ui->textEdit->setPlainText(textbox);
}
else if(senderObj=="btn3"){
textbox.append("3");
ui->textEdit->setPlainText(textbox);
}
else if(senderObj=="btn4"){
textbox.append("4");
ui->textEdit->setPlainText(textbox);
}
else if(senderObj=="btn5"){
textbox.append("5");
ui->textEdit->setPlainText(textbox);
}
else if(senderObj=="btn6"){
textbox.append("6");
ui->textEdit->setPlainText(textbox);
}
else if(senderObj=="btn7"){
textbox.append("7");
ui->textEdit->setPlainText(textbox);
}
else if(senderObj=="btn8"){
textbox.append("8");
ui->textEdit->setPlainText(textbox);
}
else if(senderObj=="btn9"){
textbox.append("9");
ui->textEdit->setPlainText(textbox);
}
else if(senderObj=="btnplus"){ //+
if(textbox.isEmpty()) textbox.append("0");
if(have_op){
int res = cal_res(textbox);
QString r = QString("%1").arg(res, 1, 10);
ui->textEdit->setPlainText(r);
ui->showbox->append(textbox+"="+r);
have_op = false;
}
else{
textbox.append("+");
ui->textEdit->setPlainText(textbox);
have_op = true;
}
}
else if(senderObj=="btnsub"){ // -
if(textbox.isEmpty()) textbox.append("0");
if(have_op){
int res = cal_res(textbox);
QString r = QString("%1").arg(res, 1, 10);
ui->textEdit->setPlainText(r);
ui->showbox->append(textbox+"="+r);
have_op = false;
}
else{
textbox.append("-");
ui->textEdit->setPlainText(textbox);
have_op = true;
}
}
else if(senderObj=="btnmul"){ // *
if(textbox.isEmpty()) textbox.append("0");
if(have_op){
int res = cal_res(textbox);
QString r = QString("%1").arg(res, 1, 10);
ui->textEdit->setPlainText(r);
ui->showbox->append(textbox+"="+r);
have_op = false;
}
else{
textbox.append("*");
ui->textEdit->setPlainText(textbox);
have_op = true;
}
}
else if(senderObj=="btndiv"){ // ÷
if(textbox.isEmpty()) textbox.append("0");
if(have_op){
int res = cal_res(textbox);
if(res == -65530){
ui->textEdit->setPlainText("除数不能为0");
}
QString r = QString("%1").arg(res, 1, 10);
ui->textEdit->setPlainText(r);
ui->showbox->append(textbox+"="+r);
have_op = false;
}
else{
textbox.append("/");
ui->textEdit->setPlainText(textbox);
have_op = true;
}
}
else if(senderObj=="equal"){
QString exp = ui->textEdit->toPlainText();
int res = cal_res(exp);
QString r = QString("%1").arg(res, 1, 10);
ui->textEdit->setPlainText(r);
ui->showbox->append(textbox+"="+r);
have_op = false;
}
}
void Widget::on_clear_clicked()
{
ui->textEdit->setPlainText("");
}
int Widget::cal_res(QString exp){
char op;
int op_pos; //操作符位置
//qDebug()<<"exp[0]="<<exp[0];
for(QChar c:exp){
//qDebug()<<"c="<<c;
if(c=='+' || c=='-' || c=='*' || c=='/')
op = c.toLatin1();
}
op_pos = exp.indexOf(op,1);
//qDebug()<<"op_pos: "<<op_pos;
int res = 0;
QString ep1;
ep1 = exp.left(op_pos);
QString ep2;
ep2 = exp.mid(op_pos+1);
//qDebug()<<"ep1="<<ep1<<"ep2="<<ep2;
switch(op){
case '+':
res = ep1.toInt() + ep2.toInt();
break;
break;
case '-':
res = ep1.toInt() - ep2.toInt();
break;
case '*':
res = ep1.toInt() * ep2.toInt();
break;
case '/':
if(ep2.toInt()==0){
return -65530;
}
res = ep1.toInt() / ep2.toInt();
break;
default:
qDebug()<<"exp error";break;
}
//qDebug()<<"res="<<res;
return res;
}
void Widget::on_del_clicked()
{
//删除textedit最后一个字符
QString str = ui->textEdit->toPlainText();
str.chop(1);
//qDebug()<<str;
ui->textEdit->setPlainText(str);
}
void Widget::on_sqr_clicked()
{
QString str = ui->textEdit->toPlainText();
char op;
for(QChar c:str){
if(c=='+' || c=='-' || c=='*' || c=='/')
op = c.toLatin1();
}
int op_pos = str.indexOf(op,1);
QString ep2;
ep2 = str.mid(op_pos+1);
int res = ep2.toInt() * ep2.toInt();
QString r = QString("%1").arg(res, 1, 10); //123+456 str.chop(str.length()-op_pos);
str.chop(str.length()-op_pos);
//qDebug()<<"del str="<<str;
ui->textEdit->setPlainText(str+r);
ui->showbox->append("sqr("+ep2+")="+r);
}
void Widget::on_clearmemory_clicked()
{
//清空信息框的东西
ui->showbox->clear();
ui->showbox->append("show info:");
}
void Widget::on_bin_clicked()
{
//求二进制
QString str = ui->textEdit->toPlainText();
char op;
for(QChar c:str){
if(c=='+' || c=='-' || c=='*' || c=='/')
op = c.toLatin1();
}
int op_pos = str.indexOf(op,1);
QString ep2;
ep2 = str.mid(op_pos+1);
int res = ep2.toInt();
QString r = QString("%1").arg(res, 1, 2);
ui->showbox->append("bin("+ep2+")="+r);
}
void Widget::on_changesigned_clicked()
{
//改变第一个数字符号
QString str = ui->textEdit->toPlainText();
if(str.at(0) != '-'){
str.insert(0,"-");
}
else{
str.remove(0,1);
}
ui->textEdit->setPlainText(str);
}