写的过程很痛,网上找不到相关的详细的分析,所以想着发一个吧。
一
二
版本看自己喜好了,我的是5.4.2。
三
类名首字母大写。
四
//calculator.h
#ifndef CALCULATOR_H
#define CALCULATOR_H
#include <QMainWindow>
namespace Ui {
class Calculator;
}
class Calculator : public QMainWindow
{
Q_OBJECT
public:
explicit Calculator(QWidget *parent = 0);
~Calculator();
enum FLAG_OPERATOR{
FLAG_OPERATOR_NONE = 0,
FLAG_OPERATOR_ADD,
FLAG_OPERATOR_SUB,
FLAG_OPERATOR_MUL,
FLAG_OPERATOR_DIV
};
private slots:
void on_tb_num0_clicked();
void on_tb_num1_clicked();
void on_tb_num2_clicked();
void on_tb_num3_clicked();
void on_tb_num4_clicked();
void on_tb_num5_clicked();
void on_tb_num6_clicked();
void on_tb_num7_clicked();
void on_tb_num8_clicked();
void on_tb_num9_clicked();
void on_tb_add_clicked();
void on_tb_equ_clicked();
void on_tb_mul_clicked();
void on_tb_clear_clicked();
void on_tb_div_clicked();
void on_tb_sub_clicked();
private:
Ui::Calculator *ui;
void clickedNumber(const QString &t);
void middleResult(void);
void model();
bool m_firstOperator;
QString m_value;
QString m_leftValue;
QString m_rightValue;
FLAG_OPERATOR m_operator;
QString m_expretion;
QString m_result;
int m_model;
};
#endif // CALCULATOR_H
其中用宏代替了“ + - x / ” 槽有0~9和“+ - x / ”
//calculator.cpp
#include "calculator.h"
#include "ui_calculator.h"
Calculator::Calculator(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Calculator)
{
ui->setupUi(this);
on_tb_clear_clicked();
m_model = 0;
}
Calculator::~Calculator()
{
delete ui;
}
void Calculator::on_tb_num0_clicked()
{
clickedNumber(ui->tb_num0->text());
}
void Calculator::on_tb_num1_clicked()
{
clickedNumber(ui->tb_num1->text());
}
void Calculator::on_tb_num2_clicked()
{
clickedNumber(ui->tb_num2->text());
}
void Calculator::on_tb_num3_clicked()
{
clickedNumber(ui->tb_num3->text());
}
void Calculator::on_tb_num4_clicked()
{
clickedNumber(ui->tb_num4->text());
}
void Calculator::on_tb_num5_clicked()
{
clickedNumber(ui->tb_num5->text());
}
void Calculator::on_tb_num6_clicked()
{
clickedNumber(ui->tb_num6->text());
}
void Calculator::on_tb_num7_clicked()
{
clickedNumber(ui->tb_num7->text());
}
void Calculator::on_tb_num8_clicked()
{
clickedNumber(ui->tb_num8->text());
}
void Calculator::on_tb_num9_clicked()
{
clickedNumber(ui->tb_num9->text());
}
void Calculator::clickedNumber(const QString &t)
{
m_value += t;
m_expretion += t;
ui->lb_expretion->setText(m_expretion);
}
void Calculator::on_tb_add_clicked()
{
middleResult();
m_operator = FLAG_OPERATOR_ADD;
m_expretion += ui->tb_add->text();
ui->lb_expretion->setText(m_expretion);
}
void Calculator::on_tb_mul_clicked()
{
middleResult();
m_operator = FLAG_OPERATOR_MUL;
m_expretion += ui->tb_mul->text();
ui->lb_expretion->setText(m_expretion);
}
void Calculator::on_tb_div_clicked()
{
middleResult();
m_operator = FLAG_OPERATOR_DIV;
m_expretion += ui->tb_div->text();
ui->lb_expretion->setText(m_expretion);
}
void Calculator::on_tb_sub_clicked()
{
middleResult();
m_operator = FLAG_OPERATOR_SUB;
m_expretion += ui->tb_sub->text();
ui->lb_expretion->setText(m_expretion);
}
void Calculator::middleResult()
{
if(m_firstOperator)
{
m_firstOperator = false;
m_leftValue = m_value;
m_value.clear();
}else
{
m_rightValue = m_value;
m_value.clear();
switch (m_operator) {
case FLAG_OPERATOR_ADD:
m_leftValue = QString::number(m_leftValue.toInt() + m_rightValue.toInt());
on_tb_equ_clicked();
break;
case FLAG_OPERATOR_SUB:
m_leftValue = QString::number(m_leftValue.toInt() - m_rightValue.toInt());
on_tb_equ_clicked();
break;
case FLAG_OPERATOR_MUL:
m_leftValue = QString::number(m_leftValue.toInt() * m_rightValue.toInt());
on_tb_equ_clicked();
break;
case FLAG_OPERATOR_DIV:
if(m_rightValue == "0")
{
Calculator::on_tb_clear_clicked();
ui->lb_result->setText("除数不能为0");
}
else
{
m_leftValue = QString::number(m_leftValue.toInt() / m_rightValue.toInt());
on_tb_equ_clicked();
}
break;
default:
break;
}
}
}
void Calculator::on_tb_equ_clicked()
{
m_rightValue = m_value;
m_value.clear();
switch (m_operator) {
case FLAG_OPERATOR_ADD:
m_result = QString::number(m_leftValue.toInt() + m_rightValue.toInt());
break;
case FLAG_OPERATOR_MUL:
m_result = QString::number(m_leftValue.toInt() * m_rightValue.toInt());
break;
case FLAG_OPERATOR_DIV:
m_result = QString::number(m_leftValue.toInt() / m_rightValue.toInt());
break;
case FLAG_OPERATOR_SUB:
m_result = QString::number(m_leftValue.toInt() - m_rightValue.toInt());
break;
default:
break;
}
ui->lb_result->setText(m_result);
}
void Calculator::on_tb_clear_clicked()
{
m_firstOperator = true;
m_operator = FLAG_OPERATOR_NONE;
m_value.clear();
m_expretion.clear();
m_result.clear();
m_leftValue.clear();
m_rightValue.clear();
ui->lb_expretion->setText("0");
ui->lb_result->setText("0");
}
四则运算部分:将运算部分封装到了on_tb_equ_clicked()即“=”的槽中(偷个懒~~~),on_tb_clear_clicked()函数实现运算符左,右值的清除和两个显示
窗口的内容清除。
错误报告部分:除数不能为0
case FLAG_OPERATOR_DIV:
if(m_rightValue == "0")
{
Calculator::on_tb_clear_clicked();
ui->lb_result->setText("除数不能为0");
}
else
{
m_leftValue = QString::number(m_leftValue.toInt() / m_rightValue.toInt());
on_tb_equ_clicked();
}
break;
还有一些儿我没写(偷懒)比如:连续输入运算符错误;结果的数值过大无法正常显示;
//main.cpp
#include "calculator.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Calculator w;
w.show();
return a.exec();
}
都能看懂不说了。
//calculator.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Calculator</class>
<widget class="QMainWindow" name="Calculator">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>336</width>
<height>406</height>
</rect>
</property>
<property name="windowTitle">
<string>Calculator</string>
</property>
<widget class="QWidget" name="centralWidget">
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>0</y>
<width>301</width>
<height>331</height>
</rect>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="4">
<widget class="QToolButton" name="toolButton_9">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="4" column="3">
<widget class="QToolButton" name="toolButton_7">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QToolButton" name="tb_clear">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>C</string>
</property>
</widget>
</item>
<item row="5" column="4">
<widget class="QToolButton" name="toolButton_14">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="5" column="3">
<widget class="QToolButton" name="tb_div">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>÷</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QToolButton" name="tb_num9">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>9</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QToolButton" name="tb_num8">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>8</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QToolButton" name="tb_num7">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>7</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QToolButton" name="toolButton_8">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QToolButton" name="toolButton_6">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="3" column="4">
<widget class="QToolButton" name="toolButton_5">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QToolButton" name="toolButton_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QToolButton" name="toolButton_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QToolButton" name="toolButton_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QToolButton" name="toolButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QToolButton" name="tb_num4">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>4</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QToolButton" name="tb_num5">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>5</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QToolButton" name="tb_num6">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>6</string>
</property>
</widget>
</item>
<item row="6" column="3">
<widget class="QToolButton" name="tb_mul">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>×</string>
</property>
</widget>
</item>
<item row="6" column="4">
<widget class="QToolButton" name="toolButton_26">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QToolButton" name="tb_num1">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>1</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QToolButton" name="tb_num2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>2</string>
</property>
</widget>
</item>
<item row="7" column="2">
<widget class="QToolButton" name="tb_num3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>3</string>
</property>
</widget>
</item>
<item row="7" column="3">
<widget class="QToolButton" name="tb_sub">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>-</string>
</property>
</widget>
</item>
<item row="8" column="2">
<widget class="QToolButton" name="toolButton_19">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>.</string>
</property>
</widget>
</item>
<item row="8" column="3">
<widget class="QToolButton" name="tb_add">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>+</string>
</property>
</widget>
</item>
<item row="8" column="0" colspan="2">
<widget class="QToolButton" name="tb_num0">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>0</string>
</property>
</widget>
</item>
<item row="7" column="4" rowspan="2">
<widget class="QToolButton" name="tb_equ">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>=</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="5">
<widget class="QLabel" name="lb_result">
<property name="font">
<font>
<family>黑体</family>
<pointsize>14</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="0" colspan="5">
<widget class="QLabel" name="lb_expretion">
<property name="font">
<font>
<family>黑体</family>
<pointsize>14</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>336</width>
<height>23</height>
</rect>
</property>
<widget class="QMenu" name="menu">
<property name="title">
<string> 菜单</string>
</property>
<addaction name="action"/>
<addaction name="action_2"/>
<addaction name="action_3"/>
<addaction name="separator"/>
<addaction name="action_5"/>
</widget>
<widget class="QMenu" name="menu_2">
<property name="title">
<string>帮助</string>
</property>
<addaction name="actionHelp"/>
</widget>
<addaction name="menu"/>
<addaction name="menu_2"/>
</widget>
<widget class="QToolBar" name="mainToolBar">
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
</widget>
<widget class="QStatusBar" name="statusBar"/>
<action name="action">
<property name="text">
<string>普通</string>
</property>
</action>
<action name="action_2">
<property name="text">
<string>科学</string>
</property>
</action>
<action name="action_3">
<property name="text">
<string>程序猿</string>
</property>
</action>
<action name="action_5">
<property name="text">
<string>退出</string>
</property>
</action>
<action name="actionHelp">
<property name="text">
<string>help</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>
新人都是画的,所以还是贴个图吧。
为了完整的模仿win7的计算器但又很多功能目前实现不了,只能用“...”代替了。
先写这么多等会了再帖,如有用,请君收藏。