2、QT的使用——基本操作、实现四则运算

目录

一、基本操作

1、按钮的使用

2、文本框获取数据,并启动进程

3、信号与槽

4、关闭界面

二、实现四则运算计算器

1、在widget.h定义私有变量字符串,用于保存按下的值,并显示在mainLineEdit上

2、在widget.cpp中实现将按下的值显示在mainLineEdit上(数字,加减乘除,括号类似)

3、清空健

4、删除一个

5、初始化显示的界面(界面大小、标题、字体和大小)

6、按钮放图片和改变按钮背景色

7、实现计算器

(1)用栈,要添加头文件

(2)算法

(3)优先级的判断


一、基本操作

1、按钮的使用

(1)右击按钮,选中转到槽,选择clicked(),即单击

(2)点击后,在widget.cpp会出现初始化的代码

void Widget::on_commitButton_clicked()
{                       }

(3)在头文件中自动添加如下代码

private slots:
    void on_commitButton_clicked();//槽

2、文本框获取数据,并启动进程

(1)在widget.h中添加(添加进程的头文件)

#include <QProcess>

(2)在widget.cpp中添加点击的函数中

    QString program = ui->cmdLineEdit->text();//获取lineedit数据
    QProcess *myProcess = new QProcess(this);//创建process对象
    myProcess->start(program);//启动进程

3、信号与槽

connnect有四个参数:谁发出信号,发出什么信号,谁处理信号,怎么处理

//回车健实现功能
connect(ui->cmdLineEdit, SIGNAL(returnPressed()), this, SLOT(on_commitButton_clicked()));
//单击实现功能
connect(ui->cancelButton, &QPushButton::clicked, this, &Widget::on_cancelButton_clicked);
//点击后实现文本框跳出
connect(ui->browseButton, &QPushButton::clicked, [this]()
{
    QMessageBox::information(this, "信息", "点击浏览");
});

4、关闭界面

this->close();

二、实现四则运算计算器

1、在widget.h定义私有变量字符串,用于保存按下的值,并显示在mainLineEdit上

#include <string.h>
QString expression;

2、在widget.cpp中实现将按下的值显示在mainLineEdit上(数字,加减乘除,括号类似)

void Widget::on_oneButton_clicked()
{
    expression += "1";
    ui->mainLineEdit->setText(expression);
}

3、清空健

void Widget::on_clearButton_clicked()
{
    expression.clear();
    ui->mainLineEdit->clear();
}

4、删除一个

void Widget::on_delButton_clicked()
{
    expression.chop(1);
    ui->mainLineEdit->setText(expression);
}

5、初始化显示的界面(界面大小、标题、字体和大小)

    this->setMaximumSize(200, 280);//固定大小
    this->setMinimumSize(200, 280);

    this->setWindowTitle("计算器");//设置标题

    QFont f("仿宋", 14);    //字体对象
    ui->mainLineEdit->setFont(f);

6、按钮放图片和改变按钮背景色

    //按钮上放图片
    QIcon con("D:\\QTProject\\QtOnline\\calculator\\tt.PNG");
    ui->delButton->setIcon(con);

    //改变按钮背景色
    ui->equalButton->setStyleSheet("background:blue");

7、实现计算器

(1)用栈,要添加头文件

#include <QStack>

(2)算法

void Widget::on_equalButton_clicked()
{
    QStack<int> s_num, s_opt;//创建对象的时候,已经初始化

    char opt[128] = {0};//数组,存储expression的数据
    int i = 0, tmp = 0, num1, num2;

    //把QString转换成char *
    QByteArray ba;           //数组类
    ba.append(expression);   //把QString转换成QByteArray
    strcpy(opt, ba.data());  //data可以把QByteArray转换成const char *

    while (opt[i] != '\0' || s_opt.empty() != true)
    {
        if (opt[i] >= '0' && opt[i] <= '9')
        {
            tmp = tmp * 10 + opt[i] - '0';//变成数组
            i++;
            if (opt[i] < '0' || opt[i] > '9')
            {
                s_num.push(tmp);
                tmp = 0;
            }
        }
        else           //操作符
        {
            if (s_opt.empty() == true || Priority(opt[i]) > Priority(s_opt.top()) ||
                    (s_opt.top() == '(' && opt[i] != ')'))
            {
                s_opt.push(opt[i]);
                i++;
                continue;
            }

            if (s_opt.top() == '(' && opt[i] == ')')
            {
                s_opt.pop();
                i++;
                continue;
            }

            if (Priority(opt[i]) <= Priority(s_opt.top()) || (opt[i] == ')' && s_opt.top() != '(') ||
                (opt[i] == '\0' && s_opt.empty() != true))
            {
                char ch = s_opt.top();
                s_opt.pop();
                switch(ch)
                {
                    case '+':
                        num1 = s_num.top();
                        s_num.pop();
                        num2 = s_num.top();
                        s_num.pop();
                        s_num.push(num1 + num2);
                        break;
                    case '-':
                        num1 = s_num.top();
                        s_num.pop();
                        num2 = s_num.top();
                        s_num.pop();
                        s_num.push(num1 - num2);
                        break;
                    case '*':
                        num1 = s_num.top();
                        s_num.pop();
                        num2 = s_num.top();
                        s_num.pop();
                        s_num.push(num1 * num2);
                        break;
                    case '/':
                        num1 = s_num.top();
                        s_num.pop();
                        num2 = s_num.top();
                        s_num.pop();
                        s_num.push(num1 / num2);
                        break;
                }
            }
        }
    }
    ui->mainLineEdit->setText(QString::number(s_num.top()));
    expression.clear();
}

(3)优先级的判断

int Widget::Priority(char ch)
{
    switch(ch)
    {
        case '(':
            return 3;
        case '*':
        case '/':
            return 2;
        case '+':
        case '-':
            return 1;
        default:
            return 0;
    }
}

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值