QT学习笔记—— 编写一个简单的计算器

Posted 玛丽莲茼蒿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT学习笔记—— 编写一个简单的计算器相关的知识,希望对你有一定的参考价值。

一、UI布局

  • 新建项目的时候选择 QMainWindow
  • 一开始进去的时候QT Designer是灰色的不能用,解决方法:
    (1)点击IDE左下角的Debug
    (2)去Forms文件夹里双击.ui文件就可以了
  • 详解布局
    (1) 5.14.2版本的有四种布局,在右边
    (2)选中空白区域,点击上面一栏任意布局,整体的布局就变了;整体布局在右边查看(根据centralwidget左边的图案判断)
    (3)红色箭头指向的地方可以取消选中的布局
    (4)怎样设计布局?
    首先要有控件,选中控件以后再去点布局。
  • 计算器的布局设计

    右边两个红色的框框出来的是控件的名字,写mainwindow.cpp文件时需要用到,具体用法是ui->控件名字

二、在头文件中添加凹槽、必要的成员变量

  • 文件mainwindow.h
  • 在private处添加必要的成员变量,作用见注释
  • 凹槽slots对应着某个事件发生后,触发的那个函数。
  • 添加的内容如下
private:
    int empty = 1; // empty=1时,应该向label_value1输入; empty=2时,应该向label_value2输入
    int sign = 0;  // 记录label_sign里的符号是什么,1=add;2=sub;4=div;3=mul

private slots:
     void onPushButton_0_Clicked();
     void onPushButton_1_Clicked();
     void onPushButton_2_Clicked();
     void onPushButton_3_Clicked();
     void onPushButton_4_Clicked();
     void onPushButton_5_Clicked();
     void onPushButton_6_Clicked();
     void onPushButton_7_Clicked();
     void onPushButton_8_Clicked();
     void onPushButton_9_Clicked();
     void onPushButton_add_Clicked();
     void onPushButton_sub_Clicked();
     void onPushButton_mul_Clicked();
     void onPushButton_div_Clicked();
     void onPushButton_equ_Clicked();
     void onPushButton_clear_Clicked();

三、完整project(粘过去就能运行的那种)

思路
为了简单起见,我将输入框拆成了两个(这样就不用切割字符串了哈哈哈),用empty这个成员变量来判断应该写入第一个还是第二个。实现的逻辑非常简单啦,逻辑只写了一个小时左右,下面的注释也很清晰,应该能看懂。

  1. mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    int empty = 1; // empty=1时,应该向label_value1输入; empty=2时,应该向label_value2输入
    int sign = 0;  // 记录label_sign里的符号是什么,1=add;2=sub;4=div;3=mul

private slots:
     void onPushButton_0_Clicked();
     void onPushButton_1_Clicked();
     void onPushButton_2_Clicked();
     void onPushButton_3_Clicked();
     void onPushButton_4_Clicked();
     void onPushButton_5_Clicked();
     void onPushButton_6_Clicked();
     void onPushButton_7_Clicked();
     void onPushButton_8_Clicked();
     void onPushButton_9_Clicked();
     void onPushButton_add_Clicked();
     void onPushButton_sub_Clicked();
     void onPushButton_mul_Clicked();
     void onPushButton_div_Clicked();
     void onPushButton_equ_Clicked();
     void onPushButton_clear_Clicked();

};
#endif // MAINWINDOW_H
  1. main.cpp不用动
#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    //w.setMouseTracking(true);
    w.show();
    return a.exec();
}

  1. mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    /*-------------连接各个按钮的信号和槽----------------*/
    connect( ui->pushButton_0,SIGNAL(clicked()),this,SLOT(onPushButton_0_Clicked()));
    connect( ui->pushButton_1,SIGNAL(clicked()),this,SLOT(onPushButton_1_Clicked()));
    connect( ui->pushButton_2,SIGNAL(clicked()),this,SLOT(onPushButton_2_Clicked()));
    connect( ui->pushButton_3,SIGNAL(clicked()),this,SLOT(onPushButton_3_Clicked()));
    connect( ui->pushButton_4,SIGNAL(clicked()),this,SLOT(onPushButton_4_Clicked()));
    connect( ui->pushButton_5,SIGNAL(clicked()),this,SLOT(onPushButton_5_Clicked()));
    connect( ui->pushButton_6,SIGNAL(clicked()),this,SLOT(onPushButton_6_Clicked()));
    connect( ui->pushButton_7,SIGNAL(clicked()),this,SLOT(onPushButton_7_Clicked()));
    connect( ui->pushButton_8,SIGNAL(clicked()),this,SLOT(onPushButton_8_Clicked()));
    connect( ui->pushButton_9,SIGNAL(clicked()),this,SLOT(onPushButton_9_Clicked()));
    connect( ui->pushButton_clear,SIGNAL(clicked()),this,SLOT(onPushButton_clear_Clicked()));  //清除
    connect( ui->pushButton_equ,SIGNAL(clicked()),this,SLOT(onPushButton_equ_Clicked()));  //出结果
    connect( ui->pushButton_add,SIGNAL(clicked()),this,SLOT(onPushButton_add_Clicked()));  //加
    connect( ui->pushButton_sub,SIGNAL(clicked()),this,SLOT(onPushButton_sub_Clicked()));  //减
    connect( ui->pushButton_mul,SIGNAL(clicked()),this,SLOT(onPushButton_mul_Clicked()));  //乘
    connect( ui->pushButton_div,SIGNAL(clicked()),this,SLOT(onPushButton_div_Clicked()));  //除

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onPushButton_0_Clicked(){
    if(empty==1){  //仍在输入value1
        if(ui->label_value1->text().toInt()==0){
             ui->label_value1->setText("0");  //用0覆盖0
        }else{
             ui->label_value1->setText(ui->label_value1->text()+"0"); //后缀一个字符串“0”
        }

    }else if(empty==2){  //仍在输入value2
        if(ui->label_value2->text().toInt()==0){
             ui->label_value2->setText("0");  //用0覆盖0
        }else{
             ui->label_value2->setText(ui->label_value2->text()+"0"); //后缀一个字符串“0”
        }
    }
}

void MainWindow::onPushButton_1_Clicked(){
    /*-----打印发送者---
    QObject *obj = sender();           //获取发送者
    QString name = obj->objectName();  //或qDebug(QPrintable(obj->objectName()));
    qDebug(name);                      //或qDebug("%s",name);
    ----------------*/
    if(empty==1){  //仍在输入value1
        if(ui->label_value1->text().toInt()==0){
             ui->label_value1->setText("1");  //用1覆盖0
        }else{
             ui->label_value1->setText(ui->label_value1->text()+"1"); //后缀一个字符串“1”
        }

    }else if(empty==2){  //仍在输入value2
        if(ui->label_value2->text().toInt()==0){
             ui->label_value2->setText("1");  //用1覆盖0
        }else{
             ui->label_value2->setText(ui->label_value2->text()+"1"); //后缀一个字符串“1”
        }
    }
}

void MainWindow::onPushButton_2_Clicked(){
    if(empty==1){  //仍在输入value1
        if(ui->label_value1->text().toInt()==0){
             ui->label_value1->setText("2");  //用2覆盖0
        }else{
             ui->label_value1->setText(ui->label_value1->text()+"2"); //后缀一个字符串“2”
        }

    }else if(empty==2){  //仍在输入value2
        if(ui->label_value2->text().toInt()==0){
             ui->label_value2->setText("2");  //用2覆盖0
        }else{
             ui->label_value2->setText(ui->label_value2->text()+"2"); //后缀一个字符串“1”
        }
    }
}

void MainWindow::onPushButton_3_Clicked(){
    if(empty==1){  //仍在输入value1
        if(ui->label_value1->text().toInt()==0){
             ui->label_value1->setText("3");  //用3覆盖0
        }else{
             ui->label_value1->setText(ui->label_value1->text()+"3"); //后缀一个字符串“3”
        }

    }else if(empty==2){  //仍在输入value2
        if(ui->label_value2->text().toInt()==0){
             ui->label_value2->setText("3");  //用3覆盖0
        }else{
             ui->label_value2->setText(ui->label_value2->text()+"3"); //后缀一个字符串“3”
        }
    }
}

void MainWindow::onPushButton_4_Clicked(){
    if(empty==1){  //仍在输入value1
        if(ui->label_value1->text().toInt()==0){
             ui->label_value1->setText("4");  //用4覆盖0
        }else{
             ui->label_value1->setText(ui->label_value1->text()+"4"); //后缀一个字符串“4”
        }

    }else if(empty==2){  //仍在输入value2
        if(ui->label_value2->text().toInt()==0){
             ui->label_value2->setText("4");  //用4覆盖0
        }else{
             ui->label_value2->setText(ui->label_value2->text()+"4"); //后缀一个字符串“4”
        }
    }
}

void MainWindow::onPushButton_5_Clicked(){
    if(empty==1){  //仍在输入value1
        if(ui->label_value1->text().toInt()==0){
             ui->label_value1->setText("5");  //用5覆盖0
        }else{
             ui->label_value1->setText(ui->label_value1->text()+"5"); //后缀一个字符串“5”
        }

    }else if(empty==2){  //仍在输入value2
        if(ui->label_value2->text().toInt()==0){
             ui->label_value2->setText("5");  //用5覆盖0
        }else{
             ui->label_value2->setText(ui->label_value2->text()+"5"); //后缀一个字符串“5”
        }
    }
}

void MainWindow::onPushButton_6_Clicked(){
    if(empty==1){  //仍在输入value1
        if(ui->label_value1->text().toInt()==0){
             ui->label_value1->setText("6");  //用6覆盖0
        }else{
             ui->label_value1->setText(ui->label_value1->text()+"6"); //后缀一个字符串“6”
        }

    }else if(empty==2){  //仍在输入value2
        if(ui->label_value2->text().toInt()==0){
             ui->label_value2->setText("6");  //用6覆盖0
        }else{