通过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();
}