欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

QT制作计算器终极版

程序员文章站 2022-07-03 17:34:12
...

UI和main函数跟上一篇一样

下面是计算器接口和实现

jsuanqi.h

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/* 
 * File:   Jisuanqi.h
 * 
 *
 * Created on 2018年8月18日, 上午12:01
 */

#ifndef JISUANQI_H
#define JISUANQI_H
#include "ui_jisuanqi.h"

class Jisuanqi : public QMainWindow {
    Q_OBJECT
public:
    Jisuanqi();
    virtual ~Jisuanqi();
    
    void iniSignalSolts();//信号与槽关联
    
    void calculate();//计算
    
    void input();//接受输入
    
public slots:
    void textChanged(); // 显示框槽函数
    
    void OnClickedpb0();//按键0
    void OnClickedpb1();
    void OnClickedpb2();
    void OnClickedpb3();
    void OnClickedpb4();
    void OnClickedpb5();
    void OnClickedpb6();
    void OnClickedpb7();
    void OnClickedpb8();
    void OnClickedpb9();
    void OnClickedpbf0();// .
    void OnClickedpbf1();// =
    void OnClickedpbf2();// +
    void OnClickedpbf3();// -
    void OnClickedpbf4();// *
    void OnClickedpbf5();// /
    void OnClickedpbf6();// +/-
    void OnClickedpbf7();// C

private:
    Ui::MainWindow widget;

    char yunsuanfu;
    double d1;
    double d2;
    double d3;//结果
    bool dmaking;//输入数字状态
    bool d1ready;//d1就绪
    QString digit;//输入的数字
    QString rslt;//显示的结果
};


#endif /* JISUANQI_H */

jisuanqi.cpp

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

#include "jisuanqi.h"

Jisuanqi::Jisuanqi() {
    widget.setupUi(this);
    widget.lineEdit->setText("0");

    rslt = "0";
    digit = "";
    yunsuanfu = ' ';
    dmaking = false;
    d1ready = false;
    d1 = 0;
    d2 = 0;
    d3 = 0;


    iniSignalSolts();
}

Jisuanqi::~Jisuanqi() {
}

void Jisuanqi::iniSignalSolts() {
    connect(widget.pbf0, SIGNAL(clicked()), this, SLOT(OnClickedpbf0()));
    connect(widget.pbf1, SIGNAL(clicked()), this, SLOT(OnClickedpbf1()));
    connect(widget.pbf2, SIGNAL(clicked()), this, SLOT(OnClickedpbf2()));
    connect(widget.pbf3, SIGNAL(clicked()), this, SLOT(OnClickedpbf3()));
    connect(widget.pbf4, SIGNAL(clicked()), this, SLOT(OnClickedpbf4()));
    connect(widget.pbf5, SIGNAL(clicked()), this, SLOT(OnClickedpbf5()));
    connect(widget.pbf6, SIGNAL(clicked()), this, SLOT(OnClickedpbf6()));
    connect(widget.pbf7, SIGNAL(clicked()), this, SLOT(OnClickedpbf7()));

    connect(widget.pbf0, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pbf1, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pbf2, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pbf3, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pbf4, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pbf5, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pbf6, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pbf7, SIGNAL(clicked()), this, SLOT(textChanged()));

    connect(widget.pb0, SIGNAL(clicked()), this, SLOT(OnClickedpb0()));
    connect(widget.pb1, SIGNAL(clicked()), this, SLOT(OnClickedpb1()));
    connect(widget.pb2, SIGNAL(clicked()), this, SLOT(OnClickedpb2()));
    connect(widget.pb3, SIGNAL(clicked()), this, SLOT(OnClickedpb3()));
    connect(widget.pb4, SIGNAL(clicked()), this, SLOT(OnClickedpb4()));
    connect(widget.pb5, SIGNAL(clicked()), this, SLOT(OnClickedpb5()));
    connect(widget.pb6, SIGNAL(clicked()), this, SLOT(OnClickedpb6()));
    connect(widget.pb7, SIGNAL(clicked()), this, SLOT(OnClickedpb7()));
    connect(widget.pb8, SIGNAL(clicked()), this, SLOT(OnClickedpb8()));
    connect(widget.pb9, SIGNAL(clicked()), this, SLOT(OnClickedpb9()));

    connect(widget.pb0, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pb1, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pb2, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pb3, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pb4, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pb5, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pb6, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pb7, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pb8, SIGNAL(clicked()), this, SLOT(textChanged()));
    connect(widget.pb9, SIGNAL(clicked()), this, SLOT(textChanged()));

}

void Jisuanqi::calculate() {
    if (dmaking && d1ready) {
        switch (yunsuanfu) {
            case '+':
                d2 = rslt.toDouble();
                d3 = d1 + d2;
                break;
            case '-':
                d2 = rslt.toDouble();
                d3 = d1 - d2;
                break;
            case '*':
                d2 = rslt.toDouble();
                d3 = d1 * d2;
                break;
            case '/':
                d2 = rslt.toDouble();
                if (d2 != 0) {
                    d3 = d1 / d2;
                } else {
                    d3 = 0;
                }
                break;
            default:
                //break;
                return;
        }
        
        QString qst = QString::number((d3), 'f'); //QString::number((d3), 'f',4)保留4位小数

        //去掉小数末尾的0/.
        //原型bool endsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
        //第二个参数表示是否区分大小写
        if (qst.contains("."))
            while (qst.endsWith("0")) {
                qst.remove(qst.length() - 1, 1);
            }
        if (qst.endsWith("."))
            qst.remove(qst.length() - 1, 1);
        rslt = qst;
    }
}

void Jisuanqi::input() {
    if (rslt != "0" && dmaking)
        rslt += digit;
    else {
        rslt = digit;
        dmaking = true;
    }
}

void Jisuanqi::textChanged() {
    widget.lineEdit->setText(rslt);
}

void Jisuanqi::OnClickedpb0() {
    digit = widget.pb0 ->text();
    input();
}

void Jisuanqi::OnClickedpb1() {
    digit = widget.pb1 ->text();
    input();
}

void Jisuanqi::OnClickedpb2() {
    digit = widget.pb2 ->text();
    input();
}

void Jisuanqi::OnClickedpb3() {
    digit = widget.pb3 ->text();
    input();
}

void Jisuanqi::OnClickedpb4() {
    digit = widget.pb4 ->text();
    input();
}

void Jisuanqi::OnClickedpb5() {
    digit = widget.pb5 ->text();
    input();
}

void Jisuanqi::OnClickedpb6() {
    digit = widget.pb6 ->text();
    input();
}

void Jisuanqi::OnClickedpb7() {
    digit = widget.pb7 ->text();
    input();
}

void Jisuanqi::OnClickedpb8() {
    digit = widget.pb8 ->text();
    input();
}

void Jisuanqi::OnClickedpb9() {
    digit = widget.pb9 ->text();
    input();
}

void Jisuanqi::OnClickedpbf0() {
    if (!dmaking) {
        rslt = "0.";
        dmaking = true;
    } else if (!rslt.contains(".")) {
        rslt += ".";
    }
}

void Jisuanqi::OnClickedpbf1() {
    calculate();
    yunsuanfu = ' ';
    d1 = 0;
    d2 = 0;
    d3 = 0;
    d1ready = false;
    dmaking = false;
}

void Jisuanqi::OnClickedpbf2() {
    calculate();
    d1 = rslt.toDouble();
    d1ready = true;
    dmaking = false;
    yunsuanfu = '+';
}

void Jisuanqi::OnClickedpbf3() {
    calculate();
    d1 = rslt.toDouble();
    d1ready = true;
    dmaking = false;
    yunsuanfu = '-';
}

void Jisuanqi::OnClickedpbf4() {
    calculate();
    d1 = rslt.toDouble();
    d1ready = true;
    dmaking = false;
    yunsuanfu = '*';
}

void Jisuanqi::OnClickedpbf5() {
    calculate();
    d1 = rslt.toDouble();
    d1ready = true;
    dmaking = false;
    yunsuanfu = '/';
}

void Jisuanqi::OnClickedpbf6() {
    if (dmaking) {
        if (rslt.startsWith("-")) {
            rslt.remove(0, 1);
        } else {
            if (rslt != "0" && rslt != "0.")
                rslt = "-" + rslt;
        }
    }
}

void Jisuanqi::OnClickedpbf7() {
    yunsuanfu = ' ';
    rslt = "0";
    digit = "";
    d1 = 0;
    d2 = 0;
    d3 = 0;
    dmaking = false;
    d1ready = false;
}

每次输入运算符时都应该执行一次计算(如果之前没有输入过运算符不会执行),并把结果存入d1以便下一次计算,再保存当前运算符,设置好输入状态;

输入等号除了计算,还应把显示结果以外的成员初始化

ui_jisuanqi.h

/********************************************************************************
** Form generated from reading UI file 'Jisuanqi.ui'
**
** Created by: Qt User Interface Compiler version 5.9.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_JISUANQI_H
#define UI_JISUANQI_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QGridLayout>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>

#pragma execution_character_set("utf-8")  //解决编码问题

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralwidget;
    QWidget *gridLayoutWidget;
    QGridLayout *gridLayout;
    QPushButton *pb3;
    QPushButton *pbf4;
    QPushButton *pb0;
    QPushButton *pbf2;
    QPushButton *pbf1;
    QPushButton *pbf5;
    QPushButton *pbf3;
    QPushButton *pb1;
    QPushButton *pb8;
    QPushButton *pb7;
    QPushButton *pb9;
    QPushButton *pb2;
    QPushButton *pbf0;
    QPushButton *pb4;
    QPushButton *pb5;
    QPushButton *pb6;
    QLineEdit *lineEdit;
    QWidget *horizontalLayoutWidget;
    QHBoxLayout *horizontalLayout;
    QPushButton *pbf7;
    QPushButton *pbf6;
    QMenuBar *menubar;
    QStatusBar *statusbar;
    QToolBar *toolBar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QStringLiteral("MainWindow"));
        MainWindow->resize(400, 450);
        MainWindow->setStyleSheet(QStringLiteral(""));
        centralwidget = new QWidget(MainWindow);
        centralwidget->setObjectName(QStringLiteral("centralwidget"));
        gridLayoutWidget = new QWidget(centralwidget);
        gridLayoutWidget->setObjectName(QStringLiteral("gridLayoutWidget"));
        gridLayoutWidget->setGeometry(QRect(10, 130, 381, 271));
        gridLayout = new QGridLayout(gridLayoutWidget);
        gridLayout->setObjectName(QStringLiteral("gridLayout"));
        gridLayout->setContentsMargins(0, 0, 0, 0);
        pb3 = new QPushButton(gridLayoutWidget);
        pb3->setObjectName(QStringLiteral("pb3"));

        gridLayout->addWidget(pb3, 6, 2, 1, 1);

        pbf4 = new QPushButton(gridLayoutWidget);
        pbf4->setObjectName(QStringLiteral("pbf4"));

        gridLayout->addWidget(pbf4, 5, 3, 1, 1);

        pb0 = new QPushButton(gridLayoutWidget);
        pb0->setObjectName(QStringLiteral("pb0"));

        gridLayout->addWidget(pb0, 7, 0, 1, 1);

        pbf2 = new QPushButton(gridLayoutWidget);
        pbf2->setObjectName(QStringLiteral("pbf2"));

        gridLayout->addWidget(pbf2, 7, 3, 1, 1);

        pbf1 = new QPushButton(gridLayoutWidget);
        pbf1->setObjectName(QStringLiteral("pbf1"));

        gridLayout->addWidget(pbf1, 7, 2, 1, 1);

        pbf5 = new QPushButton(gridLayoutWidget);
        pbf5->setObjectName(QStringLiteral("pbf5"));

        gridLayout->addWidget(pbf5, 0, 3, 1, 1);

        pbf3 = new QPushButton(gridLayoutWidget);
        pbf3->setObjectName(QStringLiteral("pbf3"));

        gridLayout->addWidget(pbf3, 6, 3, 1, 1);

        pb1 = new QPushButton(gridLayoutWidget);
        pb1->setObjectName(QStringLiteral("pb1"));

        gridLayout->addWidget(pb1, 6, 0, 1, 1);

        pb8 = new QPushButton(gridLayoutWidget);
        pb8->setObjectName(QStringLiteral("pb8"));

        gridLayout->addWidget(pb8, 0, 1, 1, 1);

        pb7 = new QPushButton(gridLayoutWidget);
        pb7->setObjectName(QStringLiteral("pb7"));

        gridLayout->addWidget(pb7, 0, 0, 1, 1);

        pb9 = new QPushButton(gridLayoutWidget);
        pb9->setObjectName(QStringLiteral("pb9"));

        gridLayout->addWidget(pb9, 0, 2, 1, 1);

        pb2 = new QPushButton(gridLayoutWidget);
        pb2->setObjectName(QStringLiteral("pb2"));

        gridLayout->addWidget(pb2, 6, 1, 1, 1);

        pbf0 = new QPushButton(gridLayoutWidget);
        pbf0->setObjectName(QStringLiteral("pbf0"));

        gridLayout->addWidget(pbf0, 7, 1, 1, 1);

        pb4 = new QPushButton(gridLayoutWidget);
        pb4->setObjectName(QStringLiteral("pb4"));

        gridLayout->addWidget(pb4, 5, 0, 1, 1);

        pb5 = new QPushButton(gridLayoutWidget);
        pb5->setObjectName(QStringLiteral("pb5"));

        gridLayout->addWidget(pb5, 5, 1, 1, 1);

        pb6 = new QPushButton(gridLayoutWidget);
        pb6->setObjectName(QStringLiteral("pb6"));

        gridLayout->addWidget(pb6, 5, 2, 1, 1);

        lineEdit = new QLineEdit(centralwidget);
        lineEdit->setObjectName(QStringLiteral("lineEdit"));
        lineEdit->setGeometry(QRect(10, 10, 381, 51));
        lineEdit->setStyleSheet(QStringLiteral(""));
        horizontalLayoutWidget = new QWidget(centralwidget);
        horizontalLayoutWidget->setObjectName(QStringLiteral("horizontalLayoutWidget"));
        horizontalLayoutWidget->setGeometry(QRect(10, 80, 381, 51));
        horizontalLayout = new QHBoxLayout(horizontalLayoutWidget);
        horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
        horizontalLayout->setContentsMargins(0, 0, 0, 0);
        pbf7 = new QPushButton(horizontalLayoutWidget);
        pbf7->setObjectName(QStringLiteral("pbf7"));

        horizontalLayout->addWidget(pbf7);

        pbf6 = new QPushButton(horizontalLayoutWidget);
        pbf6->setObjectName(QStringLiteral("pbf6"));

        horizontalLayout->addWidget(pbf6);

        MainWindow->setCentralWidget(centralwidget);
        menubar = new QMenuBar(MainWindow);
        menubar->setObjectName(QStringLiteral("menubar"));
        menubar->setGeometry(QRect(0, 0, 400, 28));
        MainWindow->setMenuBar(menubar);
        statusbar = new QStatusBar(MainWindow);
        statusbar->setObjectName(QStringLiteral("statusbar"));
        MainWindow->setStatusBar(statusbar);
        toolBar = new QToolBar(MainWindow);
        toolBar->setObjectName(QStringLiteral("toolBar"));
        MainWindow->addToolBar(Qt::TopToolBarArea, toolBar);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "计算器", Q_NULLPTR));
        pb3->setText(QApplication::translate("MainWindow", "3", Q_NULLPTR));
        pbf4->setText(QApplication::translate("MainWindow", "*", Q_NULLPTR));
        pb0->setText(QApplication::translate("MainWindow", "0", Q_NULLPTR));
        pbf2->setText(QApplication::translate("MainWindow", "+", Q_NULLPTR));
        pbf1->setText(QApplication::translate("MainWindow", "=", Q_NULLPTR));
        pbf5->setText(QApplication::translate("MainWindow", "/", Q_NULLPTR));
        pbf3->setText(QApplication::translate("MainWindow", "-", Q_NULLPTR));
        pb1->setText(QApplication::translate("MainWindow", "1", Q_NULLPTR));
        pb8->setText(QApplication::translate("MainWindow", "8", Q_NULLPTR));
        pb7->setText(QApplication::translate("MainWindow", "7", Q_NULLPTR));
        pb9->setText(QApplication::translate("MainWindow", "9", Q_NULLPTR));
        pb2->setText(QApplication::translate("MainWindow", "2", Q_NULLPTR));
        pbf0->setText(QApplication::translate("MainWindow", ".", Q_NULLPTR));
        pb4->setText(QApplication::translate("MainWindow", "4", Q_NULLPTR));
        pb5->setText(QApplication::translate("MainWindow", "5", Q_NULLPTR));
        pb6->setText(QApplication::translate("MainWindow", "6", Q_NULLPTR));
        pbf7->setText(QApplication::translate("MainWindow", "C", Q_NULLPTR));
        pbf6->setText(QApplication::translate("MainWindow", "+/-", Q_NULLPTR));
        toolBar->setWindowTitle(QApplication::translate("MainWindow", "toolBar", Q_NULLPTR));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_JISUANQI_H

main

#include <QApplication>
#include "jisuanqi.h"

int main(int argc, char *argv[]) {
    // initialize resources, if needed
    // Q_INIT_RESOURCE(resfile);

    QApplication app(argc, argv);
    Jisuanqi jsq;
    jsq.show();

    // create and show your widgets here

    return app.exec();
}

linux下   用netbeans+qt5.9制作

由于装了双系统,拷贝到Windows  VS2017+qt也能运行,窗口标题问号可能是Windows下Qt的字符编码问题,需要在ui.h中加上一行:#pragma execution_character_set("utf-8")  

如果要用生成的exe文件运行,需要在exe目录下放入相应的dll文件,在x:\QT\5.9.2\msvc2017_64文件夹下,对应64位,我的电脑没有装对应win32位的

 

QT制作计算器终极版

QT制作计算器终极版