一.界面设计
界面设计多使用编辑器
在整个窗口中改变样式表可以实现所有按钮格式变化,具体如下
//按钮的字体及背景颜色设置
QPushButton
{
font: 12pt "Microsoft YaHei UI";
background-color: rgb(255, 255, 255);
}
//按钮鼠标悬停颜色及边框设置
QPushButton:hover
{
border:1px solid rg b(193,193,193);
background-color: rgb(221, 223, 221);
}
效果如下
二.计算功能实现
1.首先初始化。页面按钮较多,功能重复,将页面所有按钮放入按钮组中
自定义init函数
(除初始化以外,其他功能均写入同一自定义槽函数中。故使用if,else if)
按钮组:QButtonGroup 寻找页面按钮:findChildren
//建立按钮组
QButtonGroup* buttongroup=new QButtonGroup(this);
//将按钮组中的按钮放入按钮列表中
QList<QPushButton*>btnlist=this->findChildren<QPushButton*>();
//遍历列表 将按钮放入按钮组中
for(int i=0;i<btnlist.size();i++)
{
buttongroup->addButton(btnlist[i]);
}
2.输入框显示功能实现,写入自定义槽函数中。
//显示功能
QString name=btn->text();
if(name>="0" && name<="9" || name==".")
{
//点击操作符后,输入框将清空,显示下一个输入内容
if(prebtn=="+")
{
ui->lineEdit->clear();
}
else if(prebtn=="-")
{
ui->lineEdit->clear();
}
else if(prebtn=="*")
{
ui->lineEdit->clear();
}
else if(prebtn=="/")
{
ui->lineEdit->clear();
}
ui->lineEdit->insert(name);
}
上一次按键的设置。(写在槽函数最末端)
prebtn=name;
3.运算功能实现
创建QList存储数据及运算符 .h中
QVector<QVariant> vec;
.cpp中实现 以加法为例。 单击运算符,将操作数与运算符存进QList中
//首先将输入框中的文本数字转化为float类型
float val=ui->lineEdit->text().toFloat();
//如果单击了运算符按钮,将操作数与运算符存储起来
else if(name=="+")
{
//把左操作数与操作符存起来
vec[0]=val;
vec[1]="+";
}
单击等号,实现运算逻辑 加法为例
else if(name=="=")
{
//将第二个操作数与等号存储进vec
vec[2]=val;
vec[3]="=";
if(vec[1]=="+")
{
vec[4]=vec[0].toFloat()+vec[2].toFloat();
}
//将运算结果显示到输入框中,记得转换类型
ui->lineEdit->setText(vec[4].toString());
}
4.显示框中显示完整表达式
ui->lineEdit_2->clear();
//遍历整个vec,将vec中所有内容显示
for(auto var:vec)
{
ui->lineEdit_2->insert(var.toString());
}
5.在初始化init函数中 记得关联槽函数,并resize vec
connect(buttongroup,&QButtonGroup::buttonClicked,this,&MainWindow::onButtonGroupClicked);
vec.resize(20);
三.其他功能实现
C与CE键均使用clear,以C为例
else if(name=="C")//清空显示内容
{
ui->lineEdit->clear();
ui->lineEdit_2->clear();
vec.clear();
}
del功能注意光标位置的调整
获取当前光标位置 setCursorPosition( int )
else if(name=="Del")
{
//获取当前光标位置-1
ui->lineEdit->setCursorPosition(ui->lineEdit->cursorPosition()-1);
ui->lineEdit->del(); // 执行删除
}
简易粗糙计算器完成,但仍有许多bug,如多次运行会越界访问等问题,带继续学习完善。如有修改之处请各位指正, 多谢