Qt小案例《加法器》
要使用到的头文件
- QApplication
- QWidget
- QLabel
- QLineEdit
- QPushButton
- QDoubleValidator
- QHBoxLayout
案例的要求
- 实现一个加法器(简单的数字计算)
- 水平布局,可任意缩放
- x+y=z
- x和y只接受数字;z只能展示x+y的结果,不能编辑
- 在x和y的内容是正确之前等号的按钮是禁用的
效果展示
- x和y没有数字的时候,等号按钮是灰的(禁用的)
- x和y都有数字的时候,等号的按钮是亮的(可使用的)
- 按下“=”按钮后计算出结果,结果在第三个空显示
源代码
#include <QApplication>
#include "mywidget.h" //自定义的头文件,本案例的具体操作都在这里面
int main(int argc,char** args)
{
QApplication app(argc,args);
MyWidget w;
w.show();
return app.exec();
}
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget> //控件
#include <QPushButton> //按钮
#include <QLabel> //标签
#include <QLineEdit> //行编辑
#include <QHBoxLayout> //水平布局
#include <QDoubleValidator> //浮点数检验器
class MyWidget : public QWidget
{
Q_OBJECT //使用到了信号和槽,所以是Qt对C++的拓展语法,所以需要加这个宏
public:
explicit MyWidget(QWidget *parent = nullptr); //构造函数声明
private:
QPushButton* btn; //"="
QLabel* la; //"+"
QLineEdit* x; //x+y=z
QLineEdit* y;
QLineEdit* z;
signals:
public slots: //槽函数的规定写法
void onxyEdit(); //响应x和y的编辑内容
void onBtn(); //响应"="按钮
};
#endif // MYWIDGET_H
#include "mywidget.h"
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
//先给个个组件进行初始化操作
x=new QLineEdit(this);
y=new QLineEdit(this);
z=new QLineEdit(this);
btn=new QPushButton("=",this);
la=new QLabel("+",this);
//装箱操作
QHBoxLayout* layout=new QHBoxLayout(this);
layout->addWidget(x);
layout->addWidget(la);
layout->addWidget(y);
layout->addWidget(btn);
layout->addWidget(z);
//设置个个组件的特性
//右对齐
x->setAlignment(Qt::AlignRight);
y->setAlignment(Qt::AlignRight);
z->setAlignment(Qt::AlignRight);
//x,y只能输入数字,其他的不行
x->setValidator(new QDoubleValidator(this));
y->setValidator(new QDoubleValidator(this));
z->setReadOnly(true);
//按钮一开始是禁用状态
btn->setEnabled(false);
//连接信号与槽
//x的值改变的时候触发当前窗口的onxyEdit槽函数
connect(x,SIGNAL(textChanged(const QString&)),
this,SLOT(onxyEdit()));
//y的值改变的时候触发当前窗口的onxyEdit槽函数
connect(y,SIGNAL(textChanged(const QString&)),
this,SLOT(onxyEdit()));
//当按钮被按下的时候触发当前窗口的onBtn槽函数
connect(btn,SIGNAL(clicked(void)),
this,SLOT(onBtn(void)));
}
//这个槽函数触发则把把按钮启动
void MyWidget::onxyEdit()
{
bool xok,yok;
x->text().toDouble(&xok); //如果成功把QString转成double则xok==true,否则xok==false
y->text().toDouble(&yok); //如果成功把QString转成double则yok==true,否则yok==false
btn->setEnabled(xok && yok);//如果xok和yok都为true则btn按钮被激活(解除禁用状态)
}
//这个槽函数触发则把计算记过放到z框中
void MyWidget::onBtn()
{
//先将字符串转成数字然后才相加
double result=x->text().toDouble()+y->text().toDouble();
//显示在窗口的内容必须是字符串,所以结果算出来了要再把数字转成字符串
QString str=QString::number(result);
//最后把结果给到z
z->setText(str);
}