QT---信号、槽和常用控件

信号、槽与控件

信号和槽介绍

信号和槽:是QT框架引以为豪的东西,实际上就是观察者模式,使用connect函数可以为 信号 建立好连接,当信号触发时,槽做出相应处理

观察者模式:比如说,老师在给学生上课,当老师发出下课信号,这时学生就可以处理自己的事情(买零食,说话,接水,,,,)

信号来自于 被观察者(老师),槽来自于 观察者(学生)

信号(Signal):函数声明,无需实现;系统大多数类都内置了信号,开发者也可以自定义信号
槽(Slot):本质也是个函数,一般是类的成员函数,必须有声明且有实现;系统大多数类都内置了槽,开发者也可以自定义槽

信号和槽的联动(connect)

connect使用:
connect(被观察者,信号,观察者,槽);
connect(被观察者,信号,Lamda表达式匿名函数);
connect(被观察者,SIGNAL(信号),观察者,SLOT(槽函数));//老版本用法

控件

指用户看到的所有可视化界面以及界面中的各个元素,比如按钮、文本框、输入框等。其实上次所说的按钮也是一个控件,他包含在不同的头文件中,比如说:

 1. #include <QPushButton> //QT中按钮的头文件,按钮控件
 2. #include <QLabel> //文本控件
 3. #include<QSlider>	//滑动条控件
 4. #include <QProgressBar>//进度条控件
 5. #include <QTextEdit>//文本编辑框控件

练习1

题目描述

创建3个按钮,分别是 最大化,最小化,正常化,点击这三个按钮分别给出不同的反应,和平常我们的使用一样(最大化,最小化,正常化)。

代码描述

#include "Widget.h"
#include <QPushButton> //QT中按钮的头文件,按钮控件

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("Start");  //设置窗口标题

//创建按钮
    QPushButton* btnMax = new QPushButton("最大化",this);//自动释放
    auto btnMin = new QPushButton("最小化",this);
    btnMin->move(100,0);//防止两个按钮重合
    auto btnNorm = new QPushButton("正常",this);
    btnNorm->move(200,0);//防止两个按钮重合
 
//建立链接(最大化,最小化,正常)
    connect(btnMax,&QPushButton::clicked,this,&QWidget::showMaximized);
    connect(btnMin,&QPushButton::clicked,this,&QWidget::showMinimized);
    connect(btnNorm,&QPushButton::clicked,this,&QWidget::showNormal);
    
}

Widget::~Widget()
{

}

结果展示

请添加图片描述
请添加图片描述

练习2

题目描述

设置按钮:鼠标按下,打印文本1;鼠标抬起,打印文本2
这里用到了lamada表达式以后介绍。

代码描述

#include "Widget.h"
#include <QPushButton> //QT中按钮的头文件,按钮控件
#include <QDebug>	//文本打印

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("Start");  //设置窗口标题

//练习1:设置按钮:鼠标按下,打印文本1;鼠标抬起,打印文本2

    QPushButton* btn = new QPushButton("点击",this);
    btn->move(300,200);

//建立连接,当点击按钮时,调用Lamda表达式
    connect(btn,&QPushButton::pressed,[]()->void{
         qDebug()<<"中奖了!";});
    connect(btn,&QPushButton::released,[]()->void{
         qDebug()<<"好开心!";});

}

Widget::~Widget()
{

}

结果

在这里插入图片描述

练习3

题目描述

通过滑动滑动条,改变字体大小(没有改变字体的槽,用lamda表达式)

代码

#include "Widget.h"
#include <QPushButton> //QT中按钮的头文件,按钮控件
#include <QLabel> //文本控件
#include <QSlider>//滑动条控件
#include <QProgressBar>//进度条控件
#include <QTextEdit>//文本编辑框控件
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("Start");  //设置窗口标题
//常用控件:(便于信号和槽之间的连接)

    //文本控件
    QLabel *laber= new QLabel;
    laber->setParent(this);
    laber->move(0,100);
    laber->setText("前方路窄,方显英雄本色");
    laber->setFont(QFont("楷体",20,10,1));

    //滑动条控件
    QSlider* slider = new QSlider;
    slider->setParent(this);
    slider->move(300,100);
    slider->setValue(0);//设置滑动条的值
    slider->setMaximum(100);

    //练习2:通过滑动滑动条,改变字体大小(没有改变字体的槽,用lamda表达式)
    connect(slider,&QSlider::valueChanged,[laber](int _value)->void{
        laber->setFont(QFont("楷体",_value,10,1));
        laber->resize(500+_value,_value+100);
    });

}

Widget::~Widget()
{

}

结果

请添加图片描述请添加图片描述

练习4

题目描述

通过滑动条改变进度条案例

代码

#include "Widget.h"
#include <QPushButton> //QT中按钮的头文件,按钮控件
#include <QLabel> //文本控件
#include <QSlider>//滑动条控件
#include <QProgressBar>//进度条控件
#include <QTextEdit>//文本编辑框控件
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("Start");  //设置窗口标题
//常用控件:(便于信号和槽之间的连接)

    //文本控件
    QLabel *laber= new QLabel;
    laber->setParent(this);
    laber->move(0,100);
    laber->setText("前方路窄,方显英雄本色");
    laber->setFont(QFont("楷体",20,10,1));

    //滑动条控件
    QSlider* slider = new QSlider;
    slider->setParent(this);
    slider->move(300,100);
    slider->setValue(0);//设置滑动条的值
    slider->setMaximum(100);

    //通过滑动滑动条,改变字体大小(没有改变字体的槽,用lamda表达式)
    connect(slider,&QSlider::valueChanged,[laber](int _value)->void{
        laber->setFont(QFont("楷体",_value,10,1));
        laber->resize(500+_value,_value+100);
    });


    //进度条控件
    QProgressBar*  probar = new QProgressBar;
    probar->setParent(this);
    probar->move(0,300);
    probar->resize(this->size().width(),20);//跟随窗口大小的宽
    probar->setValue(0);
    //probar->setMaximum(99);

    //通过滑动条改变进度条案例
    connect(slider,&QSlider::valueChanged,[probar](int _value)->void{
        probar->setValue(_value);
    });

}

Widget::~Widget()
{

}

结果

请添加图片描述

练习5

题目描述

通过编辑文本框,改变Laber文本内容

代码

#include "Widget.h"
#include <QPushButton> //QT中按钮的头文件,按钮控件
#include <QLabel> //文本控件
#include <QSlider>//滑动条控件
#include <QProgressBar>//进度条控件
#include <QTextEdit>//文本编辑框控件
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("Start");  //设置窗口标题

//常用控件:(便于信号和槽之间的连接)

    //文本控件
    QLabel *laber= new QLabel;
    laber->setParent(this);
    laber->move(0,100);
    laber->setText("前方路窄,方显英雄本色");
    laber->setFont(QFont("楷体",20,10,1));

    //滑动条控件
    QSlider* slider = new QSlider;
    slider->setParent(this);
    slider->move(300,100);
    slider->setValue(0);//设置滑动条的值
    slider->setMaximum(100);

    //通过滑动滑动条,改变字体大小(没有改变字体的槽,用lamda表达式)
    connect(slider,&QSlider::valueChanged,[laber](int _value)->void{
        laber->setFont(QFont("楷体",_value,10,1));
        laber->resize(500+_value,_value+100);
    });


    //进度条控件
    QProgressBar*  probar = new QProgressBar;
    probar->setParent(this);
    probar->move(0,300);
    probar->resize(this->size().width(),20);//跟随窗口大小的宽
    probar->setValue(0);
    //probar->setMaximum(99);

    //通过滑动条改变进度条案例
    connect(slider,&QSlider::valueChanged,[probar](int _value)->void{
        probar->setValue(_value);
    });


    //文本编辑框控件
    QTextEdit* texte = new QTextEdit;
    texte->setParent(this);
    texte->move(0,350);
    texte->resize(200,200);
    texte->setFontUnderline(1);
    texte->setFontPointSize(qreal(35.5));
    texte->setText("莫愁前路无知己");

    //通过编辑文本框,改变Laber文本内容
    connect(texte,&QTextEdit::textChanged,[laber,texte]()->void{
                QString text = texte->toPlainText();//获取文本
                laber->setText(text);
            });
}

Widget::~Widget()
{

}

结果

请添加图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值