分享一点在用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文本框有没有结果的,比如分母为零的时候,不用他,虽然会弹出警告框,但结果框一样会弹出来。


相关文章推荐

Qt5编写科学计算器碰到的一个问题

最近在编写计算器的时候,碰到了一些问题,比如sin按钮功能。 我的代码本来是这样写的: sin按钮槽函数 void MainWindow::on_btnSin_clicked() { ...

我在用PS过程中所学到的一点知识

  • 2012年10月08日 11:39
  • 1.08MB
  • 下载

自学的过程中遇到的问题。看了很多资料后整理出来比较完整的

上面这些东西是我在自学JS的时候找资料做出来的,找资料的时候蛮辛苦的,现在就留着以备之后用的得到。虽然简单,也是一个过程...

CDC抓取数据过程中所遇到的问题集合

1. 关于过滤POSTCODE LIKE '%8%'   CDC里面支持过滤条件,但过滤条件只能是个布尔值;而你所列的条件的返回值非布尔值,所以可以考虑定义一个存储过程,通过存储过程来判断。满足条...

移植rt73 usb无线网卡到linux2.6.28的过程中所遇到问题集锦

做毕业设计了,需要将rt73移植到tiny6410核心板上面,官方给的

在MFC中生成数据源过程中所遇到的问题及解决(如有错误,请指出)

工作需要接触MFC中的数据库编程,在配置数据库中遇到了很多问题,通过百度历经艰险终于顺利解决。 先说说我的基本配置: 电脑win7系统,32位,所用软件为Microsoft visaul C++ 20...

Ubuntu14.04安装mysql及过程中遇到的一点小问题

Ubuntu14.04出来有段时间了,前几天刚升级到这个版本,新鲜了一把。不过安装mysql时遇到了一点小问题,记录一下以备后用。 预备操作: 网上安装mysql的方法不少,大体有这么三种。  1. ...

软件项目开发过程中主要遇到的核心问题小结

1、软件项目开发合同的订立,合同需要对将来几个月甚至几年需要做的事情有个明确的定义说明,限定好工作范围、工作内容、承担的责任、项目总费用,每个阶段支付的费用都需要有明确的说明甚至付款条件等都需要一清二...
  • cxdnxs
  • cxdnxs
  • 2017年02月11日 09:45
  • 1954

关于ActivityGroup使用过程中遇到的一点问题

在工作中使用ActivityGroup的时候犯了一个严重的错误,后来经过头的点播,才豁然开朗,明白了这中间的道理,现在这些心得记录下来。   在刚开始接触ActivityGroup的时候我把它当成了...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分享一点在用Qt编写计算器的过程中所遇到的问题(主要是信号和槽的问题)大神们就没必要看了,都是一些小白摸爬打滚的经验
举报原因:
原因补充:

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