QT快速入门 | 最简单最简洁的QT入门教程 | 嵌入式UI
二、四则运算计算器部分
calculator/widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QStack> //栈的头文件
#include <string.h>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
int Priority(char ch); //定义优先级成员函数
private slots:
void on_oneBt_clicked();
void on_twoBt_clicked();
//之后的槽函数为直接复制或自己练习右击槽函数
void on_threeBt_clicked();
void on_fourBt_clicked();
void on_fiveBt_clicked();
void on_sixBt_clicked();
void on_sevenBt_clicked();
void on_eightBt_clicked();
void on_nineBt_clicked();
void on_zeroBt_clicked();
void on_addBt_clicked();
void on_subBt_clicked();
void on_mulBt_clicked();
void on_divBt_clicked();
void on_leftBt_clicked();
void on_rightBt_clicked();
void on_clearBt_clicked();
void on_deleteBt_clicked();
void on_equalBt_clicked();
private:
Ui::Widget *ui;
QString expression; //私有的成员变量来记表达式
};
#endif // WIDGET_H
calculator/widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setMinimumSize(300,300); //设置窗口大小的最小值,
this->setMaximumSize(380,390); //修改窗口大小,设置最大值,this代表当前类
/*显示的是最小值,另一个为可调整的值 */
this->setWindowTitle("计算器"); //设置窗口名字
QFont f("simHei",14); //构造一个QFont对象,帮助手册可以查到,&family为字体名称
ui->mainLineEdit->setFont(f); //设置窗口内字体,setfont函数内需要一个QFont对象
//按钮上面放图片,以对象方式存在
QIcon con("D:\\QT\\Qtproject\\QtOnline\\calculator\\删除箭头.png");
ui->deleteBt->setIcon(con);
//改变按钮背景色
ui->equalBt->setStyleSheet("background:rgba(127,127,127,127)");
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_oneBt_clicked()
{
expression += "1"; //点击1后将表达式加上1
ui->mainLineEdit->setText(expression); //将1显示出来
}
/*此部分函数为直接书写,没有在ui界面右击转到槽,运行正常。注:对应的头文件也要写好*/
void Widget::on_twoBt_clicked()
{
expression += "2";
ui->mainLineEdit->setText(expression);
}
/* 其余部分为直接复制 */
void Widget::on_threeBt_clicked()
{
expression += "3";
ui->mainLineEdit->setText(expression);
}
void Widget::on_fourBt_clicked()
{
expression += "4";
ui->mainLineEdit->setText(expression);
}
void Widget::on_fiveBt_clicked()
{
expression += "5";
ui->mainLineEdit->setText(expression);
}
void Widget::on_sixBt_clicked()
{
expression += "6";
ui->mainLineEdit->setText(expression);
}
void Widget::on_sevenBt_clicked()
{
expression += "7";
ui->mainLineEdit->setText(expression);
}
void Widget::on_eightBt_clicked()
{
expression += "8";
ui->mainLineEdit->setText(expression);
}
void Widget::on_nineBt_clicked()
{
expression += "9";
ui->mainLineEdit->setText(expression);
}
void Widget::on_zeroBt_clicked()
{
expression += "0";
ui->mainLineEdit->setText(expression);
}
void Widget::on_addBt_clicked()
{
expression += "+";
ui->mainLineEdit->setText(expression);
}
void Widget::on_subBt_clicked()
{
expression += "-";
ui->mainLineEdit->setText(expression);
}
void Widget::on_mulBt_clicked()
{
expression += "*";
ui->mainLineEdit->setText(expression);
}
void Widget::on_divBt_clicked()
{
expression += "/";
ui->mainLineEdit->setText(expression);
}
void Widget::on_leftBt_clicked()
{
expression += "(";
ui->mainLineEdit->setText(expression);
}
void Widget::on_rightBt_clicked()
{
expression += ")";
ui->mainLineEdit->setText(expression);
}
//清空输出的内容
void Widget::on_clearBt_clicked()
{
expression.clear();
ui->mainLineEdit->clear();
}
void Widget::on_deleteBt_clicked()
{
expression.chop(1);//从string最后删掉1个字符,可以在索引中找到chop的描述 QString chop()
ui->mainLineEdit->setText(expression);
}
void Widget::on_equalBt_clicked()
{
QStack<int> s_num,s_opt; //QStack是一个模板类,指定类型保存
//创建对象时会调用构造函数进行初始化
char opt[128] = {0};
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())); //QString中有个静态成员函数number(),可以把数字转换成字符串。
expression.clear();
}
int Widget::Priority(char ch)
{
switch (ch)
{
case '(':
return 3;
case '*':
case '/':
return 2;
case '+':
case '-':
return 1;
default:
return 0;
}
}