目录
简单布个局
数据按键的处理
像这种超级多的按键,直接搞个按钮组添加(参数:按键,按键编号):
QButtonGroup *bg;
bg->addButton(ui->bt0,0);
bg->addButton(ui->bt1,1);
bg->addButton(ui->bt2,2);
bg->addButton(ui->bt3,3);
bg->addButton(ui->bt4,4);
bg->addButton(ui->bt5,5);
bg->addButton(ui->bt6,6);
bg->addButton(ui->bt7,7);
bg->addButton(ui->bt8,8);
bg->addButton(ui->bt9,9);
bg->addButton(ui->btpoint,10);//添加的一些运算符
bg->addButton(ui->btjian,11);
bg->addButton(ui->btchen,12);
bg->addButton(ui->btchu,13);
然后建立一个槽响应这个按钮组的信号:
connect(bg,SIGNAL(buttonClicked(int)),this,SLOT(get_id(int)));
各个数据按键信号的处理,get_id()实现:
void MainWindow::get_id(int arg)
{
if(num.length()<30)//num是输入的数据,在这里搞个最长小于30
{
if(arg==10)//符号数据的加入
{
num.append(".");
}else if(arg==11){
num.append("-");
}else if(arg==12){
num.append("*");
}else if(arg==13){
num.append("/");
}else{
num.append(QString::number(arg));//按键数字啥的加进来
}
}
ui->label_2->setText(num);//label_2显示输入的数据
}
慢着,加号漏了,写个单独槽算了:
void MainWindow::on_btjia_clicked()
{
num.append("+");
ui->label_2->setText(num);
}
等号按键,做最后的计算
void MainWindow::on_btdeng_clicked()
{
QMap<int,int> m;//计算顺序
double number=0;
QRegExp Separator = QRegExp("[+*/-]");//字符串多字符切割,一次把各个数据全部取出来
QStringList list = num.split(Separator, QString::SkipEmptyParts);//QString字符串对字符分割函数;
int aa[4][5]={{0}};//用二维数组记录各个符号的位置,每个符号最多记录五次
//代号: 0 1 2 3 相当于表头
char array[]={'+','-','*','/'}; //需要去除的字符
for(int i=0;i<4;i++)//循环四次,分别找出运算符的位置
{
QString tmp = QString(array[i]);
int b=0;
while(num.contains(tmp))//还存在该符号,就记录下来,直到没有
{
aa[i][b+1]=num.indexOf(tmp);
//一次替换一个
int idx = 0;
idx = num.indexOf(tmp, 0);
if (-1 != idx)
{
num.replace(idx, 1, ">");//已记录的符号用>替换掉,而不改变总体长度
}
b++;
}
aa[i][0]=b;
}
//取出记录的符号位置,规定计算顺序
for (int i=0;i<aa[0][0];i++) {
m.insert(aa[0][i+1],0);
}
for (int i=0;i<aa[1][0];i++) {
m.insert(aa[1][i+1],1);
}
for (int i=0;i<aa[2][0];i++) {
m.insert(aa[2][i+1],2);
}
for (int i=0;i<aa[3][0];i++) {
m.insert(aa[3][i+1],3);
}
//第一个数为负数时,防止list越界,这里单独替换它
if(num[0]=='>')
{
list[0]=QString("%1%2").arg("-").arg(list[0]);
auto it=m.begin();
m.remove(it.key());
aa[1][0]--;
}
//好了有了各个运算符号的位置,还有其优先级,开始计算
for (int i=0;i<(aa[0][0]+aa[1][0]+aa[2][0]+aa[3][0]);i++)
{
int j=0;
for(auto it=m.begin();it!=m.end();++it)
{
if(it.value()==2)//先计算乘法
{
int doublejude=0;
if(list[j].toDouble()<0)
{
doublejude++;
}
if(list[j+1].toDouble()<0)
{
doublejude++;
}
number=qAbs(list[j].toDouble())*qAbs(list[j+1].toDouble());
m.remove(it.key());
list.removeAt(j);
list.removeAt(j);
if(doublejude==1)
{
number=-number;
}
list.insert(j,QString::number(number));
break;
}else if(it.value()==3)//再计算除法除法
{
int doublejude=0;
if(list[j].toDouble()<0)
{
doublejude++;
}
if(list[j+1].toDouble()<0)
{
doublejude++;
}
number=qAbs(list[j].toDouble())/qAbs(list[j+1].toDouble());
m.remove(it.key());
list.removeAt(j);
list.removeAt(j);
if(doublejude==1)
{
number=-number;
}
list.insert(j,QString::number(number));
break;
}else{
j++;
}
}
}
number=0;
for (int i=0;i<(aa[0][0]+aa[1][0]+aa[2][0]+aa[3][0]);i++)
{
int j=0;
for(auto it=m.begin();it!=m.end();++it)
{
if(it.value()==0)//然后加法
{
number=list[j].toDouble()+list[j+1].toDouble();
m.remove(it.key());
list.removeAt(j);
list.removeAt(j);
list.insert(j,QString::number(number));
break;
}else if(it.value()==1)//最后减法
{
number=list[j].toDouble()-list[j+1].toDouble();
m.remove(it.key());
list.removeAt(j);
list.removeAt(j);
list.insert(j,QString::number(number));
break;
}else{
j++;
}
}
}
num=list[0];
ui->label_2->setText(num);//得到的结果显示
}
最后来看看运行效果
按下等于就出来啦
好了以上就是计算器的简单实现了