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{
             ui->label_value2->setText(ui->label_value2->text()+"6"); //后缀一个字符串“6”
        }
    }
}

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

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

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

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

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

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

/*
 加法按钮
*/
void MainWindow::onPushButton_add_Clicked(){
    sign=1;  //标记实现的是加法
    empty=2;  //该写入label_value2了
    ui->label_sign->setText("+");  //改变UI上的符号
}

/*
 减法按钮
*/
void MainWindow::onPushButton_sub_Clicked(){
    sign=2;  //标记实现的是减法
    empty=2;
    ui->label_sign->setText("-");
}

/*
 乘法按钮
*/
void MainWindow::onPushButton_mul_Clicked(){
    sign=3;  //标记实现的是加法
    empty=2;
    ui->label_sign->setText("*");
}

/*
 除法按钮
*/
void MainWindow::onPushButton_div_Clicked(){
    sign=4;  //标记实现的是加法
    empty=2;
    ui->label_sign->setText("÷");
}

/*
 等号按钮
*/
void MainWindow::onPushButton_equ_Clicked(){
   if(sign==1){  //加法
       int result=ui->label_value1->text().toInt() + ui->label_value2->text().toInt();
       ui->label_result->setText(QString::number(result));
   }else if(sign==2){  //减法
       int result=ui->label_value1->text().toInt() - ui->label_value2->text().toInt();
       ui->label_result->setText(QString::number(result));
   }else if(sign==3){  //乘法
       int result=ui->label_value1->text().toInt() * ui->label_value2->text().toInt();
       ui->label_result->setText(QString::number(result));
   }else if(sign==4){  //除法
       int result=ui->label_value1->text().toInt() / ui->label_value2->text().toInt();
       ui->label_result->setText(QString::number(result));
   }else{
       return;
   }
}

/*
 清除按钮
*/
void MainWindow::onPushButton_clear_Clicked(){
   empty = 1;  //便于实现下一次运算!
   sign = 0;  //初始化
   ui->label_sign->setText(" ");
   ui->label_value1->setText("0");
   ui->label_value2->setText("0");
   ui->label_result->setText("0");
}

  1. mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QWidget" name="layoutWidget">
    <property name="geometry">
     <rect>
      <x>80</x>
      <y>90</y>
      <width>430</width>
      <height>331</height>
     </rect>
    </property>
    <layout class="QVBoxLayout" name="verticalLayout" stretch="0,3">
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout">
       <property name="sizeConstraint">
        <enum>QLayout::SetFixedSize</enum>
       </property>
       <item>
        <widget class="QLabel" name="label_value1">
         <property name="sizePolicy">
          <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
           <horstretch>0</horstretch>
           <verstretch>0</verstretch>
          </sizepolicy>
         </property>
         <property name="styleSheet">
          <string notr="true">background-color: rgb(255, 249, 180);
font: 22pt &quot;Times New Roman&quot;;</string>
         </property>
         <property name="text">
          <string>0</string>
         </property>
         <property name="alignment">
          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QLabel" name="label_sign">
         <property name="sizePolicy">
          <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
           <horstretch>0</horstretch>
           <verstretch>0</verstretch>
          </sizepolicy>
         </property>
         <property name="styleSheet">
          <string notr="true">font: 22pt &quot;Times New Roman&quot;;</string>
         </property>
         <property name="text">
          <string/>
         </property>
         <property name="alignment">
          <set>Qt::AlignCenter</set>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QLabel" name="label_value2">
         <property name="sizePolicy">
          <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
           <horstretch>0</horstretch>
           <verstretch>0</verstretch>
          </sizepolicy>
         </property>
         <property name="styleSheet">
          <string notr="true">background-color: rgb(255, 249, 180);
font: 22pt &quot;Times New Roman&quot;;</string>
         </property>
         <property name="text">
          <string>0</string>
         </property>
         <property name="alignment">
          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QLabel" name="label_equ">
         <property name="sizePolicy">
          <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
           <horstretch>0</horstretch>
           <verstretch>0</verstretch>
          </sizepolicy>
         </property>
         <property name="styleSheet">
          <string notr="true">font: 22pt &quot;Times New Roman&quot;;</string>
         </property>
         <property name="text">
          <string>=</string>
         </property>
         <property name="alignment">
          <set>Qt::AlignCenter</set>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QLabel" name="label_result">
         <property name="sizePolicy">
          <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
           <horstretch>0</horstretch>
           <verstretch>0</verstretch>
          </sizepolicy>
         </property>
         <property name="styleSheet">
          <string notr="true">background-color: rgb(255, 249, 180);
font: 22pt &quot;Times New Roman&quot;;</string>
         </property>
         <property name="text">
          <string>0</string>
         </property>
         <property name="textFormat">
          <enum>Qt::MarkdownText</enum>
         </property>
         <property name="alignment">
          <set>Qt::AlignCenter</set>
         </property>
         <property name="margin">
          <number>7</number>
         </property>
        </widget>
       </item>
      </layout>
     </item>
     <item>
      <layout class="QGridLayout" name="gridLayout">
       <item row="4" column="0">
        <widget class="QPushButton" name="pushButton_1">
         <property name="text">
          <string>1</string>
         </property>
        </widget>
       </item>
       <item row="5" column="3">
        <widget class="QPushButton" name="pushButton_div">
         <property name="styleSheet">
          <string notr="true">background-color: rgb(0, 170, 127);</string>
         </property>
         <property name="text">
          <string>/</string>
         </property>
        </widget>
       </item>
       <item row="0" column="1">
        <widget class="QPushButton" name="pushButton_8">
         <property name="text">
          <string>8</string>
         </property>
        </widget>
       </item>
       <item row="0" column="3">
        <widget class="QPushButton" name="pushButton_add">
         <property name="styleSheet">
          <string notr="true">background-color: rgb(0, 170, 127);</string>
         </property>
         <property name="text">
          <string>+</string>
         </property>
        </widget>
       </item>
       <item row="1" column="1">
        <widget class="QPushButton" name="pushButton_5">
         <property name="text">
          <string>5</string>
         </property>
        </widget>
       </item>
       <item row="5" column="2">
        <widget class="QPushButton" name="pushButton_equ">
         <property name="text">
          <string>=</string>
         </property>
        </widget>
       </item>
       <item row="5" column="0">
        <widget class="QPushButton" name="pushButton_0">
         <property name="text">
          <string>0</string>
         </property>
        </widget>
       </item>
       <item row="1" column="0">
        <widget class="QPushButton" name="pushButton_4">
         <property name="text">
          <string>4</string>
         </property>
        </widget>
       </item>
       <item row="4" column="3">
        <widget class="QPushButton" name="pushButton_mul">
         <property name="styleSheet">
          <string notr="true">background-color: rgb(0, 170, 127);</string>
         </property>
         <property name="text">
          <string>*</string>
         </property>
        </widget>
       </item>
       <item row="5" column="1">
        <widget class="QPushButton" name="pushButton_clear">
         <property name="text">
          <string>C</string>
         </property>
        </widget>
       </item>
       <item row="4" column="2">
        <widget class="QPushButton" name="pushButton_3">
         <property name="text">
          <string>3</string>
         </property>
        </widget>
       </item>
       <item row="0" column="2">
        <widget class="QPushButton" name="pushButton_9">
         <property name="text">
          <string>9</string>
         </property>
        </widget>
       </item>
       <item row="0" column="0">
        <widget class="QPushButton" name="pushButton_7">
         <property name="text">
          <string>7</string>
         </property>
        </widget>
       </item>
       <item row="1" column="3">
        <widget class="QPushButton" name="pushButton_sub">
         <property name="styleSheet">
          <string notr="true">background-color: rgb(0, 170, 127);</string>
         </property>
         <property name="text">
          <string>-</string>
         </property>
        </widget>
       </item>
       <item row="4" column="1">
        <widget class="QPushButton" name="pushButton_2">
         <property name="text">
          <string>2</string>
         </property>
        </widget>
       </item>
       <item row="1" column="2">
        <widget class="QPushButton" name="pushButton_6">
         <property name="text">
          <string>6</string>
         </property>
        </widget>
       </item>
      </layout>
     </item>
    </layout>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

  1. 最后的成果非常丑就是了
    在这里插入图片描述

四、思考

  1. 没法用String定义字符串,要用QString s这样定义。(不是C++吗?why不能用String?)
    在这里插入图片描述
  2. 重要的函数
    (1)用QString::number(“1234”)这个函数将数字转为字符串
    (2)用toIn()函数将字符串转为int型变量
  3. 槽函数写好了,信号也连上槽了,但是点击button总是没有反应。用以下代码作为测试,在程序输出窗口里也识别不到点了哪个按钮:
   QObject *obj = sender();           //获取发送者
   qDebug(QPrintable(obj->objectName()));  //打印发送者

你猜是为什么??SLOT里的函数名写错了。。。
名字都错了为什么能编译通过运行呢?真狗!在程序输出栏里才提示No such slot。艹!
在这里插入图片描述

  1. 修改了ui的控件名字后(将label_1修改为label_value1),mainwindow.cpp不认识label_value1。请添加图片描述
    改完 ui 以后记住要点击左下角的小锤子构建一下就好了。
  2. connect那里可以用循环来写,for里面改成i<=9就可以了请添加图片描述
  3. 槽函数不需要向我一样一个按钮写一个,可以写在一整个函数里
    请添加图片描述
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值