Qt从入门到放弃之:实例计算器

知识点

  • QPushButton信号函数clicked(void)
  • QLineEdit信号函数textChanged(const QString&)
  • QString编译期间直接生成的宏QStringLiteral(str)
  • 数字验证器,只允许输入数字内容
    lineEdit->setValidator(new QDoubleValidator(this));//数字验证器
  • 在创建按钮或其他控件时,可以定义一个类中的私有成员函数来完成控件的创建以及槽函数连接,在创建函数形参表中使用const char* member接收需要绑定的自定义槽函数,传递槽函数实参时使用SLOT(mySolt())
//创建按钮时,调用创建函数来创建,传递创建按钮所要连接的自定义的槽函数
m_Button = createButton(QLatin1String("="),SLOT(clickButton()));
//创建按钮并连接指定槽函数的实现
QPushButton *MainWindow::createButton(const QString& name, const char *member)
{
    QPushButton* button = new QPushButton(name,this);
    button->setEnabled(false);
    //信号和槽连接
    connect(button,SIGNAL(clicked()),this,member);
    return button;
}
//槽函数的实现
void MainWindow::clickButton()
{
    //计算结果并显示
    double num = m_editL->text().toDouble()+m_editR->text().toDouble();
    m_editO->setText(QString::number(num));
}

运行效果

当左操作数或右操作数为空时将禁用等号pushbutton,在左右操作数两个lineEdit中使用数字验证器设置只可以输入数字
在这里插入图片描述

文件结构

在这里插入图片描述

代码

Calculator.pro

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>
#include <QHBoxLayout>
#include    <QDebug>
#include <QDoubleValidator>
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

public://func
    void initWindow();

public slots:
    void enableButton(void);
    void clickButton(void);
private://func
    QLineEdit* createLineEdit(const char* member=nullptr,bool readOnlycli = false);
    QPushButton* createButton(const QString& name,const char* member);
private:
    QLineEdit* m_editL;//左操作数
    QLineEdit* m_editR;//右操作数
    QLineEdit* m_editO;//输出框
    QLabel* m_labelA;//加号label
    QPushButton* m_Button;//等号按钮
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    initWindow();
}

MainWindow::~MainWindow()
{
}

void MainWindow::initWindow()
{
    //1.界面初始化
    setWindowTitle("Calculator");//设置窗口标题
    QFont font;//设置字体的大小
    font.setPointSize(20);
    setFont(font);//应用字体到窗口
    resize(600,600);
    //创建和初始化控件

    m_editL = createLineEdit(SLOT(enableButton()));
    m_editR = createLineEdit(SLOT(enableButton()));
    m_editO = createLineEdit(nullptr ,true);
    m_labelA = new QLabel("+",this);
    m_Button = createButton(QLatin1String("="),SLOT(clickButton()));
    //添加布局
    //没有效果??
    //    QHBoxLayout* layout = new QHBoxLayout;
    //    layout->addWidget(m_editL);
    //    layout->addWidget(m_lableA);
    //    layout->addWidget(m_editR);
    //    layout->addWidget(m_Button);
    //    layout->addWidget(m_editO);
    //    this->setLayout(layout);//应用布局器
    //手动调整位置
    m_editL->move(50,30) ;
    m_labelA->move(180,30);
    m_editR->move(200,30) ;
    m_Button->move(300,30) ;
    m_editO->move(400,30) ;

}

void MainWindow::enableButton()
{
//当左右输入框有一个为空,就将禁用等号button
    if(m_editR->text() != ""&&m_editL->text() != ""){

        m_Button->setEnabled(true);
    }
    else
        m_Button->setEnabled(false);
}

void MainWindow::clickButton()
{
    //计算结果并显示
    double num = m_editL->text().toDouble()+m_editR->text().toDouble();
    m_editO->setText(QString::number(num));
}

QLineEdit *MainWindow::createLineEdit(const char *member,bool readOnly)
{
    QLineEdit *lineEdit = new QLineEdit(this);
    lineEdit->setAlignment(Qt::AlignRight);//右对齐
    lineEdit->setValidator(new QDoubleValidator(this));//数字验证器
    if(readOnly){
        lineEdit->setReadOnly(readOnly);
    }
    if(member){
        //信号和槽连接
        connect(lineEdit,SIGNAL(textChanged(const QString)),this,member);
    }
    return lineEdit;
}

QPushButton *MainWindow::createButton(const QString& name, const char *member)
{
    QPushButton* button = new QPushButton(name,this);
    button->setEnabled(false);
    //信号和槽连接
    connect(button,SIGNAL(clicked()),this,member);
    return button;

}

main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值