Qt学习 第11节:计算器重构实现

通过Qt designer设计师重构计算器案例
使用uic将CalculatorDialog.ui(xml)转换为ui_CalculatorDialog.h(C++)
 uic .\CalculatorDialog.ui -o .\ui_CalculatorDialog.h
 注:如果不手动进行转换,将来在Makefile中也可以自动完成
 使用"ui_CalculatorDialog.h"里面已经自动生成的界面相关的代码,完成代码编写
 方法一:通过继承方式,将界面相关代码继承过来直接使用
 方法二:通过组合方式,添加一个界面类的成员变量(ui),在通过该成员访问界面相关的代码,在实际开发中,推荐这种方法

 

方法一直接继承

Calculator.pro

######################################################################
# Automatically generated by qmake (3.0) ?? 12? 14 05:15:57 2021
######################################################################
 
QT       += core gui
 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
TARGET = Calculator
TEMPLATE = app
 
 
SOURCES += main.cpp\
        CalculatorDialog.cpp
 
HEADERS  += CalculatorDialog.h\
		ui_CalculatorDialog.h

ui_CalculatorDialog.h

#ifndef UI_CALCULATORDIALOG_H
#define UI_CALCULATORDIALOG_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QDialog>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QPushButton>

QT_BEGIN_NAMESPACE

class Ui_CalculatorDialog
{
public:
    QHBoxLayout *horizontalLayout;
    QLineEdit *m_addend;
    QLabel *m_add;
    QLineEdit *m_augend;
    QPushButton *m_equal;
    QLineEdit *m_result;

    void setupUi(QDialog *CalculatorDialog)
    {
        if (CalculatorDialog->objectName().isEmpty())
            CalculatorDialog->setObjectName(QStringLiteral("CalculatorDialog"));
        CalculatorDialog->resize(693, 198);
        QFont font;
        font.setFamily(QStringLiteral("Consolas"));
        font.setPointSize(20);
        CalculatorDialog->setFont(font);
		
        horizontalLayout = new QHBoxLayout(CalculatorDialog);
        horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
		
        m_addend = new QLineEdit(CalculatorDialog);
        m_addend->setObjectName(QStringLiteral("m_addend"));
        m_addend->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);

        horizontalLayout->addWidget(m_addend);

        m_add = new QLabel(CalculatorDialog);
        m_add->setObjectName(QStringLiteral("m_add"));

        horizontalLayout->addWidget(m_add);

        m_augend = new QLineEdit(CalculatorDialog);
        m_augend->setObjectName(QStringLiteral("m_augend"));
        m_augend->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);

        horizontalLayout->addWidget(m_augend);

        m_equal = new QPushButton(CalculatorDialog);
        m_equal->setObjectName(QStringLiteral("m_equal"));
        m_equal->setEnabled(false);

        horizontalLayout->addWidget(m_equal);

        m_result = new QLineEdit(CalculatorDialog);
        m_result->setObjectName(QStringLiteral("m_result"));
        m_result->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
        m_result->setReadOnly(true);

        horizontalLayout->addWidget(m_result);


        retranslateUi(CalculatorDialog);

        QMetaObject::connectSlotsByName(CalculatorDialog);
    } // setupUi

    void retranslateUi(QDialog *CalculatorDialog)
    {
        CalculatorDialog->setWindowTitle(QApplication::translate("CalculatorDialog", "Calculator", 0));
        m_add->setText(QApplication::translate("CalculatorDialog", "+", 0));
        m_equal->setText(QApplication::translate("CalculatorDialog", "=", 0));
    } // retranslateUi

};

namespace Ui {
    class CalculatorDialog: public Ui_CalculatorDialog {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_CALCULATORDIALOG_H

 CalculatorDialog.h

#ifndef CALCULATORDIALOG_H
#define CALCULATORDIALOG_H
 
#include "ui_CalculatorDialog.h"
 
class CalculatorDialog : public QDialog,public Ui::CalculatorDialog//把UI类直接继承
{
    Q_OBJECT
	
public:
    CalculatorDialog(QDialog *parent = 0);
    ~CalculatorDialog();
 
public slots:
    void EnableButton(void);
    void CalculateClicked(void);
};
 
#endif // CALCULATORDIALOG_H

CalculatorDialog.cpp 

#include "CalculatorDialog.h"

CalculatorDialog::CalculatorDialog(QDialog *parent) : QDialog(parent)
{
	//界面初始化
    setupUi(this);//this表示当前窗口,因为已经继承过来了
	//设置数字验证器,只能输入数字
    m_augend->setValidator(new QDoubleValidator(this)); 
    m_addend->setValidator(new QDoubleValidator(this)); 

    connect(m_augend,SIGNAL(textChanged(QString)),this,SLOT(EnableButton(void)));
    connect(m_addend,SIGNAL(textChanged(QString)),this,SLOT(EnableButton(void)));
    connect(m_equal,SIGNAL(clicked()),this,SLOT(CalculateClicked(void)));
}

void CalculatorDialog::EnableButton(void)
{
    bool Ism_augendANumber,Ism_addendANumber;
    m_augend->text().toDouble(&Ism_augendANumber);
    m_addend->text().toDouble(&Ism_addendANumber);
    m_equal->setEnabled(Ism_augendANumber && Ism_addendANumber);
 }
 
void CalculatorDialog::CalculateClicked(void)
{
    double result = m_augend->text().toDouble()+m_addend->text().toDouble();
    QString string = QString::number(result);
    m_result->setText(string);
}
 
CalculatorDialog::~CalculatorDialog()
{ 
}

main.cpp

#include "CalculatorDialog.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
 
    CalculatorDialog window;
    window.show();
 
    return app.exec();
}

方法二:通过组合方式,添加一个界面类的成员变量(ui)

Calculator.pro

######################################################################
# Automatically generated by qmake (3.0) ?? 12? 14 06:02:56 2021
######################################################################
QT       += core gui
 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
TARGET = Calculator
TEMPLATE = app
 
 
SOURCES += main.cpp\
        CalculatorDialog.cpp
 
HEADERS  += CalculatorDialog.h\
		ui_CalculatorDialog.h

ui_CalculatorDialog.h

#ifndef UI_CALCULATORDIALOG_H
#define UI_CALCULATORDIALOG_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QDialog>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QPushButton>

QT_BEGIN_NAMESPACE

class Ui_CalculatorDialog
{
public:
    QHBoxLayout *horizontalLayout;
    QLineEdit *m_addend;
    QLabel *m_add;
    QLineEdit *m_augend;
    QPushButton *m_equal;
    QLineEdit *m_result;

    void setupUi(QDialog *CalculatorDialog)//因为把this指针传了进来,所以这些操作都是CalculatorDialog类在操作,而且这些成员在动态生成的时候已经包含进了CalculatorDialog类中
    {
		//观察到所有控件的父窗口都是CalculatorDialog类
        if (CalculatorDialog->objectName().isEmpty())
            CalculatorDialog->setObjectName(QStringLiteral("CalculatorDialog"));
        CalculatorDialog->resize(693, 198);
        QFont font;
        font.setFamily(QStringLiteral("Consolas"));
        font.setPointSize(20);
        CalculatorDialog->setFont(font);
		
        horizontalLayout = new QHBoxLayout(CalculatorDialog);		
        horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
		
        m_addend = new QLineEdit(CalculatorDialog);
        m_addend->setObjectName(QStringLiteral("m_addend"));
        m_addend->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);

        horizontalLayout->addWidget(m_addend);

        m_add = new QLabel(CalculatorDialog);
        m_add->setObjectName(QStringLiteral("m_add"));

        horizontalLayout->addWidget(m_add);

        m_augend = new QLineEdit(CalculatorDialog);
        m_augend->setObjectName(QStringLiteral("m_augend"));
        m_augend->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);

        horizontalLayout->addWidget(m_augend);

        m_equal = new QPushButton(CalculatorDialog);
        m_equal->setObjectName(QStringLiteral("m_equal"));
        m_equal->setEnabled(false);

        horizontalLayout->addWidget(m_equal);

        m_result = new QLineEdit(CalculatorDialog);
        m_result->setObjectName(QStringLiteral("m_result"));
        m_result->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
        m_result->setReadOnly(true);

        horizontalLayout->addWidget(m_result);


        retranslateUi(CalculatorDialog);

        QMetaObject::connectSlotsByName(CalculatorDialog);
    } // setupUi

    void retranslateUi(QDialog *CalculatorDialog)
    {
        CalculatorDialog->setWindowTitle(QApplication::translate("CalculatorDialog", "Calculator", 0));
        m_add->setText(QApplication::translate("CalculatorDialog", "+", 0));
        m_equal->setText(QApplication::translate("CalculatorDialog", "=", 0));
    } // retranslateUi

};

namespace Ui {
    class CalculatorDialog: public Ui_CalculatorDialog {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_CALCULATORDIALOG_H

  CalculatorDialog.h

#ifndef CALCULATORDIALOG_H
#define CALCULATORDIALOG_H
 
#include <QDialog>

namespace Ui {	//为了Ui命名空间里的CalculatorDialog类做申明,具体实现在别的地方
class CalculatorDialog;
}
class CalculatorDialog : public QDialog
{
    Q_OBJECT
	
public:
    explicit CalculatorDialog(QDialog *parent = 0);
    ~CalculatorDialog();
 
public slots:
    void EnableButton(void);
    void CalculateClicked(void);
	
private:
	Ui::CalculatorDialog* ui;
};
 
#endif // CALCULATORDIALOG_H

CalculatorDialog.cpp 

#include "CalculatorDialog.h"
#include "ui_CalculatorDialog.h"
CalculatorDialog::CalculatorDialog(QDialog *parent) : QDialog(parent),ui(new  Ui::CalculatorDialog)
{//注意这里动态生成了一个Ui::CalculatorDialog,并用ui指向了他,所以CalculatorDialog类就引入这些元素
	//界面初始化
    ui->setupUi(this);//把当前窗口的this指针传了过去
	
	//设置数字验证器,只能输入数字
    ui->m_augend->setValidator(new QDoubleValidator(this)); 
    ui->m_addend->setValidator(new QDoubleValidator(this)); 

    connect(ui->m_augend,SIGNAL(textChanged(QString)),this,SLOT(EnableButton(void)));
    connect(ui->m_addend,SIGNAL(textChanged(QString)),this,SLOT(EnableButton(void)));
    connect(ui->m_equal,SIGNAL(clicked()),this,SLOT(CalculateClicked(void)));
}

void CalculatorDialog::EnableButton(void)
{
    bool Ism_augendANumber,Ism_addendANumber;
    ui->m_augend->text().toDouble(&Ism_augendANumber);
    ui->m_addend->text().toDouble(&Ism_addendANumber);
    ui->m_equal->setEnabled(Ism_augendANumber && Ism_addendANumber);
 }
 
void CalculatorDialog::CalculateClicked(void)
{
    double result = ui->m_augend->text().toDouble()+ui->m_addend->text().toDouble();
    QString string = QString::number(result);
    ui->m_result->setText(string);
}
 
CalculatorDialog::~CalculatorDialog()
{ 
	delete ui;//记得释放ui所指向的空间
}

main.cpp

#include "CalculatorDialog.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
 
    CalculatorDialog window;
    window.show();
 
    return app.exec();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值