当前位置: 首页 > news >正文

使用二阶构造实现计算器页面的构造过程

二阶构造

一. 构造函数

1.1 构造函数的特点

  1. 类的构造函数用于对象的初始化
  2. 构造函数与类同名并且没有返回值
  3. 构造函数在对象定义时自动被调用
  4. 所以构造函数只能决定的只是对象的初始状态,而不是对象的诞生

1.2 构造的过程

  1. 资源无关的初始化操作:不会出现异常情况的操作

  2. 需要使用系统资源的操作:可能出现异常情况,如:内存申请,访问文件等 请添加图片描述

二. 使用二阶构造实现计算器页面的构造过程

1.1 代码

  1. 类的声明

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <QLineEdit>
    #include <QPushButton>
    
    class CalculatorUI : public QWidget
    {
        //  如果一个类中有用户自定义槽函数,必须在类的起始位置加这个声明
        Q_OBJECT
    
        QLineEdit *le;
        QPushButton* button[20];
        CalculatorUI(QWidget *parent = nullptr);
    
    public:
        void show();
        static CalculatorUI* NewInstance();  //静态成员函数,CalculatorUI类的资源申请,不一定申请成功,所以要能通过类名访问
        bool construct();
        ~CalculatorUI();
    
    private slots:
        void onButtonClicked();
    
    };
    #endif // WIDGET_H
    
    
  2. 类的实现

    #include "Widget.h"
    #include "ui_Widget.h"
    #include <QLineEdit>
    #include <QPushButton>
    
    #include <QDebug>
    
    //构造函数本身不执行任何资源申请的操作了
    CalculatorUI::CalculatorUI(QWidget *parent): QWidget(parent, Qt::WindowCloseButtonHint)
        : QWidget(parent)
    {
    }
    
    //由于构造函数没有返回值无法判断组件构造过程是否顺利,定义一个带bool类型返回值的构造函数,来实现构造的过程
    bool CalculatorUI::construct()
    {
        bool ret = true;
        QString icon[20] = {
            "7", "8", "9", "+", "(",
            "4", "5", "6", "-", ")",
            "1", "2", "3", "*", "<-",
            "0", ".", "=", "/", "C"
        };
    
        le = new QLineEdit(this);
        //每一个组件的构造都要判断,是否申请成功
        if(nullptr != le){
            le->move(10, 10);
            le->resize(240, 30);
            le->setAlignment(Qt::AlignRight);
        }else{
            ret = false;
        }
    
        //    QPushButton* button[20];
        for(int i=0; i<4; i++){
            for(int j=0; j<5; j++){
                button[i*5+j] = new QPushButton(this);
    
                if (nullptr != button[i*5+j]){
                    button[i*5+j]->move(10+j*50, 50+i*50);
                    button[i*5+j]->resize(40, 40);
                    button[i*5+j]->setText(icon[i*5+j]);
                    QObject::connect(button[i*5+j], SIGNAL(clicked()), this, SLOT(onButtonClicked()));
                }else{
                    ret = false;
                }
    
            }
        }
    
        return ret;
    }
    
    
    //CalculatorUI本身也需要判断是否申请内存成功,此函数为静态成员函数,可以通过类名访问
    CalculatorUI* CalculatorUI::NewInstance()
    {
        CalculatorUI* ret = new CalculatorUI();
    
        if((nullptr == ret) || !ret->construct()) {
            delete ret;
            ret = nullptr;
        }
        return ret;
    }
    
    
    void CalculatorUI::show()
    {
        setFixedSize(260, 250);
        QWidget::show();
    }
    
    CalculatorUI::~CalculatorUI()
    {
        //delete[] button;
    }
    
    
    
    void CalculatorUI::onButtonClicked()
    {
        QPushButton *tmp = (QPushButton *)sender(); //sender()作用是获取发送信号的组件
        qDebug() << tmp->text() ;
    
    }
    
    
    
  3. main函数

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        //为cal申请资源
        CalculatorUI* cal = CalculatorUI::NewInstance();
        int ret = -1;
    
        if(nullptr != cal){
            cal->show();
            ret = a.exec();
            delete cal;
        }
    
        return ret;
    }
    

相关文章:

  • Linux内核的CodingStyle
  • 常见面试题及面试准备阶段要思考的问题
  • Qt中事件的传递过程
  • Qt事件初探-发现事件
  • Qt中TCP通信的实现
  • ubuntu下MQTT的移植安装
  • MQTT协议 发布/订阅 机制初探 - (模拟物联网传感器设备和控制模块间的通信)
  • MQTT初探
  • VScode快捷键
  • Linux C的MQTT测试代码编写 - 跨主机的MQTT客户端通信
  • Linux系统嵌入式设备的串口通信
  • Anaconda在Windows的安装
  • notebook修改默认打开的路径
  • Python实现MQTT客户端的基本功能
  • 初探C++标准库
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • HTTP--网络协议分层,http历史(二)
  • miaov-React 最佳入门
  • mongodb--安装和初步使用教程
  • Redux 中间件分析
  • Vue学习第二天
  • Yii源码解读-服务定位器(Service Locator)
  • 从PHP迁移至Golang - 基础篇
  • 大数据与云计算学习:数据分析(二)
  • 坑!为什么View.startAnimation不起作用?
  • 来,膜拜下android roadmap,强大的执行力
  • 前端面试总结(at, md)
  • 使用 QuickBI 搭建酷炫可视化分析
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • Hibernate主键生成策略及选择
  • 阿里云ACE认证之理解CDN技术
  • 如何在招聘中考核.NET架构师
  • ​如何防止网络攻击?
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (007)XHTML文档之标题——h1~h6
  • (C)一些题4
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (十六)串口UART
  • (十五)使用Nexus创建Maven私服
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (算法)N皇后问题
  • (正则)提取页面里的img标签
  • (转) ns2/nam与nam实现相关的文件
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET : 在VS2008中计算代码度量值
  • .Net CF下精确的计时器
  • .NET CLR Hosting 简介
  • .NET CLR基本术语
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .net项目IIS、VS 附加进程调试
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • [1]-基于图搜索的路径规划基础
  • [1204 寻找子串位置] 解题报告