博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt计算器开发(二):信号槽实现数学表达式合法性检查
阅读量:6568 次
发布时间:2019-06-24

本文共 2667 字,大约阅读时间需要 8 分钟。

表达式的合法性

由于我们的计算器不是单步计算的,所以我们能够一次性输入一个长表达式。然而假设用户输入的长表达式不合法的话,那么就会引发灾难。所以有必要对于用户的输入做一个限制。

一些限制举例:

比方,在输入了左括号以后那么接下来,不能输入运算符。此时运算符要是不可用的状态。在输入了右括号以后不能直接输入数字,此时数字键应该是不可用状态。等等此类的。

在这里我使用了信号与槽的方式来实现。点击不同的button,会发展出不同的信号。在这之后的事,点击button本身无需考虑,这也是信号槽的良好的设计理念造成的效果,符合面向对象的迪米特原则。

实现部分

常量

首先我们先定义五个常量:

const int INIT = 0;const int DIGIT = 1;const int OPERA = 2;const int LEFT = 3;const int RIGHT = 4;
第一个常量表示初始化,这里也把它作为按键信号,可理解为特殊的按键,由于在最開始的时候,我们不能输入运算符,右括号,所以初始化时运算符,右括号为不可用状态。

信号与槽

主窗体的头文件中声明一句:

signals:    void whichBtn(int type);
了解Qt的都知道,信号signal函数是特殊函数,无需实现部分。

然后在乘法button的槽函数中:

void MainWindow::on_btnMuti_clicked(){    QString s = ui->lineEdit->text();    ui->lineEdit->setText(s+"*");    emit whichBtn(OPERA);}

上面的ui->lineEdit就是我们计算器的屏幕控件。上面的s就是屏幕上已有的表达式了,点击乘号*button那么表达式后面多一个乘号*。然后发射一个信号whichBtn(OPERA).其它button类似。

然后怎样处理信号呢?

这里我在主窗体类的头文件中又声明了几个槽函数:

void enableDigit(int type);    void enableOp(int type);    void enableLeft(int type);    void enableRight(int type);    void enableEqual(int type);

用来实现button可用与否的实现,比方第一个是运算符可用与否,它的实现代码:

void MainWindow::enableOp(int type){    bool enable = false;    switch(type)    {    case DIGIT:enable = true;        break;    case INIT:    case OPERA:    case LEFT:enable = false;        break;    default:return;    }    ui->btnMuti->setEnabled(enable);//乘    ui->btnDivi->setEnabled(enable);//除    ui->btnAdd->setEnabled(enable);//加    ui->btnSub->setEnabled(enable);//减}

连接

最后呢,我们要连接啦。

connect(this,&MainWindow::whichBtn,&MainWindow::enableOp);    connect(this,&MainWindow::whichBtn,&MainWindow::enableLeft);    connect(this,&MainWindow::whichBtn,&MainWindow::enableEqual);    connect(this,&MainWindow::whichBtn,&MainWindow::enableRight);    connect(this,&MainWindow::whichBtn,&MainWindow::enableDigit);

我这里用的是Qt5的新版connect写法,之前版本号的语法也兼容,只是不太鼓舞。由于太不安全了。很多错误仅仅有执行时才发现。由于原来的写法信号和槽都被转换为字符串了,那么我写错了信号或槽函数的名称是相同能够编译通过的,仅仅有执行时才干检測出来。而新语法则能保证在编译期间就检查出错误来。

右括号的处理

另外值得一提的是:右括号的可用性与其它button不同,它仅仅于左括号相关,而且一定要与左括号数目同样才合法。所以我在主窗体类里声明了一个整型变量lefts用于保存左括号的数目。

在右括号可用性的槽函数中:

void MainWindow::enableRight(int type){    bool enable = false;    switch(type)    {    case INIT:    case OPERA:        break;    case LEFT:enable = true;    case RIGHT:    case DIGIT:        if(lefts)            enable = true;        break;    default:return;    }    ui->btnRight->setEnabled(enable);}
须要推断
lefts是否为零,假设不为零那么右括号可用,enable设为true。
相同的在我们点击了一个左括号后,在槽函数
void
MainWindow
::
on_btnLeft_clicked
()中须要对
lefts进行加一操作。而当我们点击了一个右括号后须要在槽函数
void
MainWindow
::
on_btnRight_clicked
()中对
lefts进行减一操作。

================= 本 项 目 文 章 及 源 码 链 接===============

|==   ==|
|==          ==|
|==                         ==|
|==                                                    ==|
|==         ==|
=======================================================

转载地址:http://hupjo.baihongyu.com/

你可能感兴趣的文章
jquery javascript获得网页的高度和宽度
查看>>
2019 -2-15 复习
查看>>
vim锁定屏幕
查看>>
实用的 JavaScript 调试小技巧
查看>>
027移除元素
查看>>
Linux下清理内存和Cache方法
查看>>
CodeVS 1018 单词接龙(DFS)
查看>>
我的博客园的CSS和html设置
查看>>
工作中简单的kettle使用
查看>>
spark shuffle:分区原理及相关的疑问
查看>>
Laravel5.5 使用第三方Vendor添加注册验证码
查看>>
06- Linux下sublime下载与使用
查看>>
前端文摘:Web 开发模式演变历史和趋势
查看>>
将图片序列转化为视频文件
查看>>
jQuery的文档操作***
查看>>
js 小数取整,js 小数向上取整,js小数向下取整
查看>>
vue-cli3.0
查看>>
window.location.replace vs window.location.href
查看>>
CVPR 2018:阿里提出应用 LocalizedGAN 进行半监督训练
查看>>
被劫持的wordpress.com账户被用来感染站点
查看>>