目录
1、在widget.h定义私有变量字符串,用于保存按下的值,并显示在mainLineEdit上
2、在widget.cpp中实现将按下的值显示在mainLineEdit上(数字,加减乘除,括号类似)
一、基本操作
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;
}
}