使用二阶构造实现计算器页面的构造过程
二阶构造
一. 构造函数
1.1 构造函数的特点
- 类的构造函数用于对象的初始化
- 构造函数与类同名并且没有返回值
- 构造函数在对象定义时自动被调用
- 所以构造函数只能决定的只是对象的初始状态,而不是对象的诞生
1.2 构造的过程
-
资源无关的初始化操作:不会出现异常情况的操作
-
需要使用系统资源的操作:可能出现异常情况,如:内存申请,访问文件等
二. 使用二阶构造实现计算器页面的构造过程
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
-
类的实现
#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() ; }
-
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; }