使用QPushButton实现计算机

1. 按钮类:QPushButton

1.1 信号

 void clicked(bool checked = false)//被点击触发void pressed()//当按下按钮时发出此信号void released()//当松开按钮时发出此信号void toggled(bool checked)//每当可检查按钮改变其状态时,都会发出此信号。

1.2 实现按钮的三种方式

1.2.1 一、使用代码实现按钮相关功能

1.2.1.1 按钮类的实例化
第一种:源码实现QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr) //参数1传递图片,参数2传递文本,参数3指定父对象QPushButton(const QString &text, QWidget *parent = nullptr)//参数1传递文本,参数2指定父对象QPushButton(QWidget *parent = nullptr)  //指定父对象

实例

第一种:源码实现QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr) //参数1传递图片,参数2传递文本,参数3指定父对象QPushButton(const QString &text, QWidget *parent = nullptr)//参数1传递文本,参数2指定父对象QPushButton(QWidget *parent = nullptr)  //指定父对象
1.2.1.2 按钮的基本方法
//设置父对象btn->setParent(this);//设置按钮显示的文本btn->setText("登录");//设置按钮的大小btn->resize(QSize(50,20));//移动按钮btn->move(100,0);//设置按钮的几何属性btn->setGeometry(100,100,100,30);//设置是否禁用按钮btn->setEnabled(true);//false:禁用   true:启用(默认)//设置按钮中的图标btn->setIcon(QIcon(":/img/photo.jpg"));//设置按钮背景是否隐藏btn->setFlat(false);//true:隐藏  false:不隐藏(默认)//设置鼠标定位到按钮上提示的文本btn->setToolTip("这是按钮");//设置按钮是否具有选中使能btn->setCheckable(true);//true:使能(默认)  false:失能btn->setChecked(true);//true:选中(默认)   false:未选中//设置按钮是否具备快捷键btn->setShortcutEnabled(0,true);//设置按钮的快捷键btn->setShortcut(QKeySequence::Backspace);//获取快捷键QKeySequence key=btn->shortcut();//设置是否是回车键作为快捷键btn->setAutoDefault(true);//true:回车键有效(默认)  false:无效//获取按钮的文本QString text=btn->text();//获取按钮中的文本//判断背景是否是隐藏bool flag= btn->isFlat();//设置按钮的字体btn->setFont(QFont("宋体",30));//设置光标btn->setCursor(Qt::PointingHandCursor);
1.2.1.3举例

熟悉按钮QPushButton的使用

qpush_button

mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H#include <QDialog>
#include <QPushButton>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Mydialog; }
QT_END_NAMESPACEclass Mydialog : public QDialog
{Q_OBJECTpublic:Mydialog(QWidget *parent = nullptr);~Mydialog();public slots:void print();private:Ui::Mydialog *ui;//实例化的三种方式QPushButton* btn = new QPushButton;
//    QPushButton* btn = new QPushButton(this);
//    QPushButton* btn = new QPushButton("登录",this);};
#endif // MYDIALOG_H
mydialog.cpp

#include "mydialog.h"
#include "ui_mydialog.h"
#include "QIcon"//熟悉按钮QPushButton的使用
Mydialog::Mydialog(QWidget *parent): QDialog(parent), ui(new Ui::Mydialog)
{ui->setupUi(this);//设置父对象btn->setParent(this);//设置按钮现实的文本btn->setText("登录");//设置按钮大小btn->resize(QSize(50,20));//移动按钮btn->move(100,0);//设置按钮的几何属性btn->setGeometry(100,100,100,30);//设置禁用按钮/* btn->setEnabled(false);*///false禁用 true启用,默认启用btn->setEnabled(true);//设置按钮图标btn->setIcon(QIcon(":/img/photo.jpg"));//设置背景是否隐藏
//    btn->setFlat(true);//true 隐藏   false不隐藏btn->setFlat(false);//设置鼠标定位到按钮位置提示文本btn->setToolTip("这里是按钮");//设置按钮是否具有选中使能btn->setCheckable(true);//true 使能 false失能btn->setChecked(true);//true 选中(默认)false 未选中//设置按钮是否具备快捷键btn->setShortcutEnabled(0,true);//设置按钮快捷键btn->setShortcut(QKeySequence::Backspace);//获取快捷键QKeySequence key = btn->shortcut();//设置是否是回车键作为快捷键btn->setAutoDefault(true);//true回车键有效(默认),false无效//获取按钮文本QString text = btn->text();//是否是隐藏bool flag = btn->isFlat();//设置按钮字体btn->setFont(QFont("宋体",15));//参数1 字体  参数2 大小//设置光标样子btn->setCursor(Qt::PointingHandCursor);//绑定按钮信号和本类槽connect(this->btn,SIGNAL(clicked()),this,SLOT(print()));//这个pushButton是我们直ui界面拖出来的不是手动写的connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(print()));}Mydialog::~Mydialog()
{delete ui;
}void Mydialog::print(){qDebug()<<"hello"<<endl;
}

1.2.2 二、ui界面实现按钮功能

text:设置按钮的文本
icon:设置图片
iconsize:设置图片的大小
shortcut:设置快捷键
checkable:设置是否选中使能
chekced:设置是否选中
autoDefaoult:设置回车键是否有效
defalut:设置默认按钮
flat:设置按钮的背景是否隐藏

1.2.3 三、采用继承QPushbutton方式

示例

class MyButton : public QPushButton
{Q_OBJECT
public:explicit MyButton(QWidget *parent = nullptr);signals:void send_Data(int a);};
1.2.3.1 举例

qpush_button_inherit

mybutton.h

#ifndef MYBUTTON_H
#define MYBUTTON_H#include <QWidget>
#include <QPushButton>class Mybutton : public QPushButton //注意这里继承的是QPushButton
{Q_OBJECT
public:explicit Mybutton(QWidget *parent = nullptr);signals://定义信号void send_data(int a);};#endif // MYBUTTON_H

mybuuton.cpp

#include "mybutton.h"Mybutton::Mybutton(QWidget *parent): QPushButton{parent}//注意这里实现构造时 继承的也是QPushButton
{}

mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H#include <QDialog>
#include<QDebug>
#include<mybutton.h>QT_BEGIN_NAMESPACE
namespace Ui { class Mydialog; }
QT_END_NAMESPACEclass Mydialog : public QDialog
{Q_OBJECTpublic:Mydialog(QWidget *parent = nullptr);~Mydialog();public slots://定义槽void receive_data(int a);//与发送数据信号绑定void print();//这个与clicked信号绑定private:Ui::Mydialog *ui;//自定义按钮实例化Mybutton* btn = new Mybutton(this);};
#endif // MYDIALOG_H

mydialog.cpp

#include "mydialog.h"
#include "ui_mydialog.h"//继承qPushButton的方式实现按钮
Mydialog::Mydialog(QWidget *parent): QDialog(parent), ui(new Ui::Mydialog)
{ui->setupUi(this);this->btn->setText("按钮");this->btn->move(100,40);//绑定clickedconnect(this->btn,SIGNAL(clicked()),this,SLOT(print()));//绑定发送数据connect(this->btn,SIGNAL(send_data(int)),this,SLOT(receive_data(int)));}Mydialog::~Mydialog()
{delete ui;
}void Mydialog::print(){//点击的槽函数实现qDebug()<<"接收到clicked信号"<<endl;emit this->btn->send_data(10);
}void Mydialog::receive_data(int a){qDebug()<<"收到数据"<<a<<endl;
}

1.2.4  练习 :实现计算机

设计一个计算器,计算0-9的加减乘除运算,并将结果进行输出(必须纯代码实现)

calculator

mydialog.h

#ifndef MYDIGLOG_H
#define MYDIGLOG_H#include <QDialog>
#include <QPushButton>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Mydiglog; }
QT_END_NAMESPACEclass Mydiglog : public QDialog
{Q_OBJECTpublic:Mydiglog(QWidget *parent = nullptr);~Mydiglog();void calculate();public slots:void print1();void print2();void print3();void print4();void print5();void print6();void print7();void print8();void print9();void print0();void print_jia();void print_jian();void print_cheng();void print_chu();void print_deng();private:Ui::Mydiglog *ui;QPushButton* btn1 = new QPushButton("1",this);QPushButton* btn2 = new QPushButton("2",this);QPushButton* btn3 = new QPushButton("3",this);QPushButton* btn4 = new QPushButton("4",this);QPushButton* btn5 = new QPushButton("5",this);QPushButton* btn6 = new QPushButton("6",this);QPushButton* btn7 = new QPushButton("7",this);QPushButton* btn8 = new QPushButton("8",this);QPushButton* btn9 = new QPushButton("9",this);QPushButton* btn0 = new QPushButton("0",this);QPushButton* btn_jia = new QPushButton("+",this);QPushButton* btn_jian = new QPushButton("-",this);QPushButton* btn_cheng = new QPushButton("*",this);QPushButton* btn_chu = new QPushButton("/",this);QPushButton* btn_deng = new QPushButton("=",this);QString str1;//存储操作符之前的数字QString caozuofu = "";//存储操作符QString str2;//存储操作符之后的数字
};
#endif // MYDIGLOG_H

mydialog.cpp

#include "mydiglog.h"
#include "ui_mydiglog.h"Mydiglog::Mydiglog(QWidget *parent): QDialog(parent), ui(new Ui::Mydiglog)
{ui->setupUi(this);btn1->move(100,80);//移动位置btn2->move(200,80);//移动位置btn3->move(300,80);//移动位置btn4->move(100,120);//移动位置btn5->move(200,120);//移动位置btn6->move(300,120);//移动位置btn7->move(100,160);//移动位置btn8->move(200,160);//移动位置btn9->move(300,160);//移动位置btn0->move(200,200);//移动位置btn_jia->move(400,200);btn_jian->move(400,160);btn_cheng->move(400,120);btn_chu->move(400,80);btn_deng->move(300,200);//绑定按钮信号和本类的槽connect(this->btn1,SIGNAL(clicked()),this,SLOT(print1()));connect(this->btn2,SIGNAL(clicked()),this,SLOT(print2()));connect(this->btn3,SIGNAL(clicked()),this,SLOT(print3()));connect(this->btn4,SIGNAL(clicked()),this,SLOT(print4()));connect(this->btn5,SIGNAL(clicked()),this,SLOT(print5()));connect(this->btn6,SIGNAL(clicked()),this,SLOT(print6()));connect(this->btn7,SIGNAL(clicked()),this,SLOT(print7()));connect(this->btn8,SIGNAL(clicked()),this,SLOT(print8()));connect(this->btn9,SIGNAL(clicked()),this,SLOT(print9()));connect(this->btn0,SIGNAL(clicked()),this,SLOT(print0()));connect(this->btn_jia,SIGNAL(clicked()),this,SLOT(print_jia()));connect(this->btn_jian,SIGNAL(clicked()),this,SLOT(print_jian()));connect(this->btn_cheng,SIGNAL(clicked()),this,SLOT(print_cheng()));connect(this->btn_chu,SIGNAL(clicked()),this,SLOT(print_chu()));connect(this->btn_deng,SIGNAL(clicked()),this,SLOT(print_deng()));}Mydiglog::~Mydiglog()
{delete ui;
}void Mydiglog::calculate(){int shuzi1 = str1.toInt();//字符转数字int shuzi2 = str2.toInt();//字符转数字if(caozuofu.at(0)=="+"){shuzi1+shuzi2;qDebug()<<shuzi1<<" + "<<shuzi2<<" = "<<shuzi1+shuzi2<<endl;}else if(caozuofu.at(0)=="-"){qDebug()<<shuzi1<<" - "<<shuzi2<<" = "<<shuzi1-shuzi2<<endl;}else if(caozuofu.at(0)=="*"){qDebug()<<shuzi1<<" * "<<shuzi2<<" = "<<shuzi1*shuzi2<<endl;}else if(caozuofu.at(0)=="/"){qDebug()<<shuzi1<<" / "<<shuzi2<<" = "<<(float)shuzi1/shuzi2<<endl;}str1.clear();//清除字符串str2.clear();caozuofu.clear();}void Mydiglog::print1(){//获取按钮文本QString text1 = btn1->text();//但这里用户输入的肯定不是操作符if(caozuofu.isEmpty()){//判断是存储操作符之前的数字还是之后的数字//用户还没输入操作符,所以数字应该记录在操作符之前的字符串里str1.append(text1);qDebug()<<str1;}else{//存入操作符之后的字符串里str2.append(text1);qDebug()<<str2;}
}void Mydiglog::print2(){//获取按钮文本QString text2 = btn2->text();//但这里用户输入的肯定不是操作符if(caozuofu.isEmpty()){//判断是存储操作符之前的数字还是之后的数字//用户还没输入操作符,所以数字应该记录在操作符之前的字符串里str1.append(text2);qDebug()<<str1;}else{//存入操作符之后的字符串里str2.append(text2);qDebug()<<str2;}
}
void Mydiglog::print3(){//获取按钮文本QString text3 = btn3->text();//但这里用户输入的肯定不是操作符if(caozuofu.isEmpty()){//判断是存储操作符之前的数字还是之后的数字//用户还没输入操作符,所以数字应该记录在操作符之前的字符串里str1.append(text3);qDebug()<<str1;}else{//存入操作符之后的字符串里str2.append(text3);qDebug()<<str2;}
}
void Mydiglog::print4(){//获取按钮文本QString text4 = btn4->text();//但这里用户输入的肯定不是操作符if(caozuofu.isEmpty()){//判断是存储操作符之前的数字还是之后的数字//用户还没输入操作符,所以数字应该记录在操作符之前的字符串里str1.append(text4);qDebug()<<str1;}else{//存入操作符之后的字符串里str2.append(text4);qDebug()<<str2;}
}
void Mydiglog::print5(){//获取按钮文本QString text5 = btn5->text();//但这里用户输入的肯定不是操作符if(caozuofu.isEmpty()){//判断是存储操作符之前的数字还是之后的数字//用户还没输入操作符,所以数字应该记录在操作符之前的字符串里str1.append(text5);qDebug()<<str1;}else{//存入操作符之后的字符串里str2.append(text5);qDebug()<<str2;}
}
void Mydiglog::print6(){//获取按钮文本QString text6 = btn6->text();//但这里用户输入的肯定不是操作符if(caozuofu.isEmpty()){//判断是存储操作符之前的数字还是之后的数字//用户还没输入操作符,所以数字应该记录在操作符之前的字符串里str1.append(text6);qDebug()<<str1;}else{//存入操作符之后的字符串里str2.append(text6);qDebug()<<str2;}
}
void Mydiglog::print7(){//获取按钮文本QString text7 = btn7->text();//但这里用户输入的肯定不是操作符if(caozuofu.isEmpty()){//判断是存储操作符之前的数字还是之后的数字//用户还没输入操作符,所以数字应该记录在操作符之前的字符串里str1.append(text7);qDebug()<<str1;}else{//存入操作符之后的字符串里str2.append(text7);qDebug()<<str2;}
}
void Mydiglog::print8(){//获取按钮文本QString text8 = btn8->text();//但这里用户输入的肯定不是操作符if(caozuofu.isEmpty()){//判断是存储操作符之前的数字还是之后的数字//用户还没输入操作符,所以数字应该记录在操作符之前的字符串里str1.append(text8);qDebug()<<str1;}else{//存入操作符之后的字符串里str2.append(text8);qDebug()<<str2;}
}
void Mydiglog::print9(){//获取按钮文本QString text9 = btn9->text();//但这里用户输入的肯定不是操作符if(caozuofu.isEmpty()){//判断是存储操作符之前的数字还是之后的数字//用户还没输入操作符,所以数字应该记录在操作符之前的字符串里str1.append(text9);qDebug()<<str1;}else{//存入操作符之后的字符串里str2.append(text9);qDebug()<<str2;}
}
void Mydiglog::print0(){//获取按钮文本QString text0 = btn0->text();//但这里用户输入的肯定不是操作符if(caozuofu.isEmpty()){//判断是存储操作符之前的数字还是之后的数字//用户还没输入操作符,所以数字应该记录在操作符之前的字符串里str1.append(text0);qDebug()<<str1;}else{//存入操作符之后的字符串里str2.append(text0);qDebug()<<str2;}
}void Mydiglog::print_jia(){//获取按钮文本QString text_jia = btn_jia->text();//这个if的作用方式用户多次点击操作符if(caozuofu.isEmpty()){//操作符得空进入caozuofu.append(text_jia);qDebug()<<caozuofu;}
}
void Mydiglog::print_jian(){//获取按钮文本QString text_jian = btn_jian->text();if(caozuofu.isEmpty()){//操作符得空进入caozuofu.append(text_jian);qDebug()<<caozuofu;}
}
void Mydiglog::print_cheng(){//获取按钮文本QString text_cheng = btn_cheng->text();if(caozuofu.isEmpty()){//操作符得空进入caozuofu.append(text_cheng);qDebug()<<caozuofu;}
}
void Mydiglog::print_chu(){//获取按钮文本QString text_chu = btn_chu->text();if(caozuofu.isEmpty()){//操作符得空进入caozuofu.append(text_chu);qDebug()<<caozuofu;}
}void Mydiglog::print_deng(){if(!str1.isEmpty() && !caozuofu.isEmpty() && !str2.isEmpty()){this->calculate();//直接跳转计算函数}else{qDebug()<<"请确保输入正确,请重新输入"<<endl;str1.clear();//清除字符串str2.clear();caozuofu.clear();}}