zoukankan      html  css  js  c++  java
  • Qt计算器开发(二):信号槽实现数学表达式合法性检查

    表达式的合法性

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

    一些限制举例:

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

    在这里我使用了信号与槽的方式来实现。点击不同的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。
    相同的在我们点击了一个左括号后,在槽函数voidMainWindow::on_btnLeft_clicked()中须要对lefts进行加一操作。而当我们点击了一个右括号后须要在槽函数voidMainWindow::on_btnRight_clicked()中对lefts进行减一操作。


    ================= 本 项 目 文 章 及 源 码 链 接===============
    |== Qt计算器开发(一):后缀表达式实现完整数学表达式的计算  ==|
    |== Qt计算器开发(二):信号槽实现数学表达式合法性检查         ==|
    |== Qt计算器开发(三):执行效果及项目总结                         ==|
    |== Qt计算器源代码下载(免积分)                                                   ==|
    |== Qt计算器GitHub托管地址(代码会不定期更新,敬请关注)        ==|
    =======================================================


  • 相关阅读:
    hdu 3335 Divisibility
    最小点覆盖,最小路径覆盖
    hdu 4109 Instrction Arrangement
    sjtu 1077 加分二叉树
    hdu 1542 Atlantis
    多线程中互斥体
    在子页面中,javascript让模板页中添加的用户控件中的控件选中focus
    模板页中用javascript判断是否为空
    控件包含代码块(即 <% ... %>),因此无法修改控件集合 asp.net
    lambda从指定集合中去除指定数据 asp.net
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4051838.html
Copyright © 2011-2022 走看看