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

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

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

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

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

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

新建一个Qt的gui工程。

mainwindow.h头文件里面:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 


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 
#include 
#include 
#include 


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"<
}*/



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