继上周学习了Qt信号与槽的相关知识,仿佛开辟了一个新天地。信号和槽用于两个对象之间的通信,信号和槽机制是Qt的核心特征,也是Qt不同于其他开发框架的最突出特征。这次我要完成的是计算器,分成三步
(1)完成加法运算
(2)完成加减乘除运算
(3)利用信号和槽产生另一个对话框
1.加法运算
新建一个窗口工程,在ui文件中画出图1所示
注意右击更改对象名称三个行编辑器我命名的是firstLineEdit,secondLineEdit,resultLineEdit,计算的按钮我命名为calButton,我们想完成的是输入两个加数的时候,点击计算按钮输出结果,这里存在信号和槽,计算按钮发出点击信号,resultLineEdit输出计算结果,建立槽函数的方式可以右击计算按钮选择“转到槽…”,也可以在函数中定义
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
//元对象系统必须加Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void calSlot();//槽函数声明
//void on_calButton_clicked();元对象系统创建,右击UI文件“计算”按钮转到槽自动生成
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp文件中添加
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setMaximumSize(393,150);
this->setMinimumSize(393,150);//设置窗口大小
QObject::connect(ui->calButton,SIGNAL(clicked()),this,SLOT(calSlot()));//信号和槽的连接
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::calSlot()//槽函数定义
{
int first=ui->firstLineEdit->text().toInt();//将加数转换为int类型
int second=ui->secondLineEdit->text().toInt();
int result;
result=first+second;
ui->resultLineEdit->setText(QString::number(result));
//void MainWindow::on_calButton_clicked()
}
运行就可以了。
2.加减乘除运算
在ui文件中将加号改为comboBox下拉列表框,双击添加项目+,-,*,/四则运算,需要调用comboBox函数currentIndex函数,这是将comboBox里的项目编号的函数
只需要将槽函数修改一下就可以
void MainWindow::calSlot()
{
int first=ui->firstLineEdit->text().toInt();
int second=ui->secondLineEdit->text().toInt();//转为int类型
int result;
if(ui->comboBox->currentIndex()==0)//判断+是否被选
{
result=first+second;
ui->resultLineEdit->setText(QString::number(result));
}
else if(ui->comboBox->currentIndex()==1)//判断-是否被选
{
result=first-second;
ui->resultLineEdit->setText(QString::number(result));
}
else if(ui->comboBox->currentIndex()==2)//判断*号
{
result=first*second;
ui->resultLineEdit->setText(QString::number(result));
}
else if(ui->comboBox->currentIndex()==3)//判断/号
{
if(second==0)
{return;}
result=first/second;
ui->resultLineEdit->setText(QString::number(result));
//setText设置文本
}
}
最后运行结果
3.产生另一个对话框
这里需要介绍另一个类QMessageBox,通过帮助我们可以看到介绍QMessageBox类提供了一个模式对话框,用于通知用户或询问用户一个问题并得到答案。
一个消息框显示一个主文本,以提醒用户一个情况,一个信息文本进一步解释警报,或者询问用户一个问题,以及一个可选的详细文本,如果用户请求的话,可以提供更多的数据。一个消息框还可以显示一个图标和标准按钮来接受用户的响应。
只需要对槽函数void MainWindow::calslot()的定义更改为
void MainWindow::calSlot()
{
int first=ui->firstLineEdit->text().toInt();
int second=ui->secondLineEdit->text().toInt();
int result;
if(ui->comboBox->currentIndex()==0)
{
result=first+second;
ui->resultLineEdit->setText(QString::number(result));
//调用静态方法
QMessageBox::information(this,"Result",QString::number(result));//调用
}
else if(ui->comboBox->currentIndex()==1)
{
result=first-second;
ui->resultLineEdit->setText(QString::number(result));
QMessageBox::information(this,"Result",QString::number(result));
}
else if(ui->comboBox->currentIndex()==2)
{
result=first*second;
ui->resultLineEdit->setText(QString::number(result));
QMessageBox::information(this,"Result",QString::number(result));
}
else if(ui->comboBox->currentIndex()==3)
{
if(second==0)
QMessageBox::warning(this,"Error Message","Second Can't be Zero!!");
result=first/second;
ui->resultLineEdit->setText(QString::number(result));
QMessageBox::information(this,"Result",QString::number(result));
}
//setText设置文本
}
还有个重要地方要注意,在mainwindow.h头文件中加上包含
#include <QMessageBox>//消息对话框
最后运行出来的结果如下:
好了,至此三个过程均完成!