我在搞这个计算器的时候简直费劲,网上完全没有这些适合小白看的东西,比如想在对话框里面输出整型变量里面的值(就是取代原本的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
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文本框有没有结果的,比如分母为零的时候,不用他,虽然会弹出警告框,但结果框一样会弹出来。