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_NAMESPACE
class Mydialog : public QDialog
{
Q_OBJECT
public:
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_NAMESPACE
class Mydialog : public QDialog
{
Q_OBJECT
public:
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);
//绑定clicked
connect(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_NAMESPACE
class Mydiglog : public QDialog
{
Q_OBJECT
public:
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();
}
}