分享一点在用Qt编写计算器的过程中所遇到的问题(主要是信号和槽的问题)大神们就没必要看了,都是一些小白摸爬打滚的经验

原创 2016年07月22日 17:11:46

我在搞这个计算器的时候简直费劲,网上完全没有这些适合小白看的东西,比如想在对话框里面输出整型变量里面的值(就是取代原本的tr),比如如何弄出文本框啊,比如怎么取出lineEdit的内容啊,比如怎么把item放进if语句里面判断(即怎么转化item为其他类型的数)

或许大神们看起来没有什么意思,但对于小白来说真是苦大仇深的东西啊,所以我特意分享出来,希望能让各位在Qt这片苦海里面刚开始遨游的小白们一点帮助。

计算器界面如图

是用三个lineEdit(lineEdit 第一个框,lineEdit_2 第二个框,resultlineEdit 结果框)

+一个label
+一个comboBox
+一个pushButton(resultButton)做的。

新建一个Qt的gui工程。

mainwindow.h头文件里面:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
public slots:
    //void on_lineEdit_returnPressed();

    //void on_lineEdit_2_returnPressed();

    void resultButton();



    void resultlineEdit();

signals:


private slots:
    void on_lineEdit_cursorPositionChanged(int arg1, int arg2);

    void on_lineEdit_2_cursorPositionChanged(int arg1, int arg2);

private:
    Ui::MainWindow *ui;
    double first;
    double second;
    double result;
    int judge;
    bool result_exist;
};

#endif // MAINWINDOW_H

上面的public slots和private slots其实没有多大差别,学过c++的都知道,只要不涉及继承之类的被其他类调用,两者其实差不多,这里都是这个类,并没有多大的要求。

定义resultButton和resultlineEdit,这里是手动关联,至于为什么不用自动关联,后面会涉及到,不过如果是按键还是可以自动关联的,我一开始没有太多经验,所以出于保险的目的用了手动关联。

后面,还定义了输入数字的两个文本框,用的是自动关联cursorPositionChanged,就是一旦对话框里面的内容改变了,他就立即保存槽的内容(嗯,大概是保存把,具体机制我不懂);

其实一开始我还以为全部部件都要转到槽去声明定义,后来才发现并不是如此,完全可以在其他槽里面调用这个槽的东西而不定义这个槽,说实话,其实连两个文本框都可不用声明定义,直接在button的槽里面获取文本框的内容,具体好像是直接将文本的定义内容复制到button的槽里面就可以了。

后面是mianwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QErrorMessage>
#include <QDebug>
#include <QMessageBox>
#include <QString>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->resultButton, SIGNAL(clicked()), this, SLOT(resultButton()));
    connect(ui->resultButton, SIGNAL(clicked()), this, SLOT(resultlineEdit()));
    first=0;
    second=0;
    result=0;
    judge=0;
    result_exist=0;
}

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

/*void MainWindow::on_lineEdit_returnPressed()
{
    first=ui->lineEdit->text().toInt();     //用toint函数返回一个整形的结果
    qDebug()<<"first"<<first;
}*/



/*void MainWindow::on_lineEdit_2_returnPressed()
{
    second=ui->lineEdit_2->text().toInt();  //用toint函数返回一个整形的结果
    qDebug()<<"second"<<second;
}*/

void MainWindow::resultButton()
{
    judge=ui->comboBox->currentIndex();
    if(judge==0)
    {
        result=first+second;
        result_exist=1;
    }
    else if(judge==1)
    {
        result=first-second;
        result_exist=1;
    }
    else if(judge==2)
    {
        result=first*second;
        result_exist=1;
    }
    else if(judge==3)
    {
        if(second!=0)
        {
            result=first/second;
            result_exist=1;
        }
        else
        {
            QErrorMessage *dialog=new QErrorMessage;
            dialog->setWindowTitle(tr("wrong window"));
            dialog->showMessage(tr("wrong message!"));
            result_exist=0;
        }

    }
//    qDebug()<<"result"<<result;
    /*QMessageBox msgBox;
    msgBox.setText("The document has been modified.");
    msgBox.exec();*/					//这是对话框的另一种定义方式,不使用指针,在栈中定义
}

void MainWindow::resultlineEdit()
{
    if(result_exist)
    {
        qDebug()<<"result1"<<result;
        ui->resultlineEdit->setText(QString::number(result));
        QMessageBox *messagebox=new QMessageBox(this);
        messagebox->information (this,tr("result:"),QString::number(result));
    }

}

void MainWindow::on_lineEdit_cursorPositionChanged(int , int )
{
    first=ui->lineEdit->text().toDouble();     //用todouble函数返回一个双浮点的结果
    qDebug()<<"first"<<first;

}

void MainWindow::on_lineEdit_2_cursorPositionChanged(int , int )
{
    second=ui->lineEdit_2->text().toDouble();  //用todouble函数返回一个双浮点的结果
    qDebug()<<"second"<<second;
}

1、那两个connect就是我的重大发现1了,原来发射信号和接受信号的槽可以是不一样的!

我让button槽的按键为信号,发射到resultlineEdit槽里面,接受到信号的他就会输出结果,还能弹出信息对话框来。

2、注意了,两个connect不能搞反了,不然你要按两次才能输出正确的结果,第一次输出的会是上一次的结果。这个可是困惑了我好久。应该是exce()函数会按顺序执行的问题吧。

3、值得一提的是combobox执行currentintdex会返回一个整型,每个item对应0,1,2,3......。如果用currenttext,你就要老老实实地跟/*-+这些对比了。这个也是搞了我好久。

4、而todouble这里也是个坑,把文本变成数返回给一个值至于他为什么要经过text()来调用呢,我也是搞不懂,大概是在text函数里面声明的吧。

5、至于重大发现2呢,就是发现如何取代对话框里面的tr这个只能输出常量字符串的顽固分子,换成用变量输出因为tr这里是把他转化为QString类型的,想在对话框里面输出result这个整型变量里面的值,就只能用把他转化为QString了,至于QString是什么呢?天知道,或许是一个类似string类的东西,总之我们只需要知道QString::number(result)可以转化他就够了。

6、result_exist这个bool型的东东主要是用来高速result文本框有没有结果的,比如分母为零的时候,不用他,虽然会弹出警告框,但结果框一样会弹出来。


用Qt实现的计算器

需求分析模块图类图核心算法中缀表达式转化为后缀表达式规则:从左到右遍历中缀表达式(表达式运算符在两数字之间,比如(2+1)3)的每个数字和符号,若是数字就输出,即成为后缀表达式(表达式运算符在数字之后...
  • jiaxingzheng
  • jiaxingzheng
  • 2015年03月13日 13:43
  • 1324

QT 信号与槽 最简单例子

QT  信号与槽 最简单例子   main.cpp 和 my_head.h源码:   #ifndef MY_HEAD_H #define MY_HEAD_H #include #inc...
  • EastonWoo
  • EastonWoo
  • 2013年05月18日 20:13
  • 5174

Qt之QLineEdit详解(附源码)

简述 QLineEdit是一个单行文本输入框。
  • rl529014
  • rl529014
  • 2016年07月29日 01:21
  • 10664

hive开发遇到的一些坑

遇到的问题: 1. 数据倾斜,程序运行非常缓慢,长时间停顿。(大表数据量500多万,小表数据量仅180条),两个表关联, 数据严重倾斜。 版本1: select   '' as id,  f1.app...
  • u010506130
  • u010506130
  • 2017年09月11日 09:27
  • 126

代码调试过程中容易遇到的问题

前两天身体有些不舒服,也没写啥新文章,昨天下了一天的雨,今天阳光明媚,空气也很新鲜,心情大好。 继翻译为什么输出是String而不是Object,今天先写一下调试方面的东西。java中自带的函数调试...
  • u012859193
  • u012859193
  • 2014年05月11日 15:06
  • 1699

学习两天Vue.js遇到的问题及解决办法。

1、vue.js数据动态绑定。 从后台获取数据转化成json对象,或者从前台转化json对象绑定。 2、点击当前一个绑定的实例,获取当前点击实例的dom标签 用methods绑定相应的方法, 在...
  • zhb1993829
  • zhb1993829
  • 2017年04月26日 09:14
  • 306

网站制作中可能遇到的问题

     随着互联网技术的革新,传统的技术格局逐渐被打破,更多更新的技术开始在该行业得到使用。网站呈现出来的不只是内容,人们越来越重视网站的效率。页面刷新的速度和视觉效果等成为衡量一个站点质量好坏的重...
  • xiaoK
  • xiaoK
  • 2006年04月11日 12:26
  • 3223

学生信息管理系统中遇到的问题

在做学生信息管理系统的过程中遇到的一些问题,如图:          对于不熟悉的我来说,这个错误整整浪费了我大概两个小时的时间。我上网查“advapi32.dll”是什么?及实施错误5...
  • liu_yujie2011com
  • liu_yujie2011com
  • 2012年08月14日 18:54
  • 2781

华为是怎样研发的(6)——问题攻关

华为是怎样开发硬件的——问题攻关 因为世界上没有完美的东西,所以就算再高的水平开发出来的产品也不可能像蒙娜丽莎一样完美无缺。所以不管大问题,还是小问题,都可能有问题。 第一部分、网上问题造...
  • z00143104
  • z00143104
  • 2015年08月02日 16:49
  • 920

经验总结——静态页面布局中的常见问题

本文总结了个人在前端开发中经常遇到的布局问题,长期更新
  • sir1241
  • sir1241
  • 2016年08月20日 09:38
  • 1482
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分享一点在用Qt编写计算器的过程中所遇到的问题(主要是信号和槽的问题)大神们就没必要看了,都是一些小白摸爬打滚的经验
举报原因:
原因补充:

(最多只允许输入30个字)