知识点
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();
}