C++ Qt引擎 (3)信号和槽

Qt应用程序开发框架

一、信号 和 槽

观察者模式  信号   槽:处理函数

 

信号 和 槽: 是QT框架引以为豪的,实际上就是观察者模式,一种简易方式
使用connect函数 可以为信号 及 槽 建立好连接,当信号广播(触发)时做出相应的处理
信号来自于被观察者来自于观察者    例如:老师(信号 被观察者)说下课了,学生(槽 观察者)做出相应的动作

信号 Signals:函数声明,无需实现 系统大多数类都内置了信号,开发者也可以自定义信号
槽   Slots:  本质是函数,一般是类的成员函数,包括虚函数、普通函数等;必须有声明且有实现体,系统大多数类也内置了槽,开发者也可以自定义槽

 

例子:

当最大化按钮被点击时,窗口变为最大化

观察者:窗口

被观察者:最大化按钮

信号:点击

槽:变最大化

 

用法:

connect(被观察者,信号,观察者,槽);  QT内置函数,专门用于连接信号和槽  //用法一

connect(被观察者,信号,Lamda表达式匿名函数); //用法二

connect(被观察者,SIGNAL(信号函数),观察者,SLOT(槽函数));  //用法三,QT4之前的老版本

#include "widget.h"
#include //按钮控件
#include 

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //定义最大化按钮 (被观察者)
    auto btnMax = new QPushButton("最大化", this);
    //this窗口  (观察者)
    //建立信号 和 槽 连接
    connect(btnMax, &QPushButton::clicked, this, &QWidget::showMaximized);

    //点击最小化
    auto btnMin = new QPushButton("最小化", this);
    btnMin->move(100, 0);
    connect(btnMin, &QPushButton::clicked, this, &QWidget::showMinimized);

    //点击正常
    auto btnNormal = new QPushButton("正常", this);
    btnNormal->move(200, 0);
    connect(btnNormal, &QPushButton::clicked, this, &QWidget::showNormal);

    //设置一个按钮
    //鼠标按下,打印  aaa
    //鼠标抬起,打印  bbb
    auto btn = new QPushButton("测试", this);
    //当按钮点击时,调用Lamda表达式函数
    connect(btn, &QPushButton::pressed, []()->void{
        qDebug() << "aaa---";
    });
    connect(btn, &QPushButton::released, []()->void{
        qDebug() << "bbb---";
    });
}

Widget::~Widget()
{

}

 

二、Lamba函表达式

C++11新特性:

nullptr 空指针

auto 自动类型

Lamda表达式  匿名函数

for each 新循环遍历方式

 

返回值 函数名(参数表){}

Lamda表达式定义函数

[可访问外部变量](参数表)->返回值{ 函数体 }

[变量名1, 变量名2...] (){}   指定部分变量访问

[=](){}                                   值传递形式捕获所有外部变量(内部无法改变实际变量)

[&](){}                                   引用形式捕获所有外部变量(可以改变实际变量)

#include "widget.h"
#include //按钮控件
#include 

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //设置一个按钮
    //鼠标按下,打印  aaa
    //鼠标抬起,打印  bbb
    auto btn = new QPushButton("测试", this);
    //当按钮点击时,调用Lamda表达式函数
    connect(btn, &QPushButton::pressed, []()->void{
        qDebug() << "aaa---";
    });
    connect(btn, &QPushButton::released, []()->void{
        qDebug() << "bbb---";
    });

    //匿名函数,函数指针
    int num = 250, num2 = 360;
    [num, num2]()->void{
        qDebug() << " aaa! ";
        qDebug() << num;
        qDebug() << num2;
    }();

    [&]()->void
    {
        num = 900;
        qDebug() << num;
    }();

    void (*pFun)();
    pFun = []()->void
    {
        qDebug() << " aaa! ";
    };
    pFun();

    //指针指向 Lamda函数*********
    int num0 = 1;
    void(*pFunction)(int&) = [](int& n)->void{
        n = 250;
        qDebug() << n;
    };
    pFunction(num0);
    qDebug() << num0;
}

Widget::~Widget()
{

}

 

三、其他控件使用信号 和 槽 实例

QLabel              文本控件
QSlider              滑动条控件
QProgressBar    进度条控件
QTextEdit          文本编辑框控件
#include "widget.h"
#include //按钮控件
#include 

#include //文本控件
#include //滑动条控件
#include //进度条控件
#include //文本编辑框控件

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //----------简单的常用控件
    //文字控件
    QLabel* label = new QLabel;
    label->setParent(this);
    label->move(0, 100);
    label->setText("文本信息?");
    label->setFont(QFont("楷体", 20, 10, 1));

    //滑动条控件
    QSlider* slider = new QSlider;
    slider->setParent(this);
    slider->move(300, 100);
    slider->setValue(0);//设置滑动条值
    slider->setMaximum(100);//设置滑动条最大值
    //通过滑动滑动条,改变字体大小
    connect(slider, &QSlider::valueChanged, [label](int _value){
        label->setFont(QFont("楷体", _value, 10, 1));
        label->resize(500 + _value, _value + 100);
    });

    //进度条控件
    QProgressBar* proBar = new QProgressBar;
    proBar->setParent(this);
    proBar->move(0, 400);
    proBar->resize(this->size().width(), 50);
    proBar->setValue(0);
    //通过滑动滑动条,改变进度条进度
    connect(slider, &QSlider::valueChanged, [proBar](int _value){
        proBar->setValue(_value);
    });

    //文本编辑框
    QTextEdit* edit = new QTextEdit;
    edit->setParent(this);
    edit->move(0, 300);
    edit->resize(200, 200);
    edit->setFontUnderline(1);//设置文字下划线
    edit->setFontPointSize(qreal(50));//设置字体大小 qreal double
    edit->setText("编辑框测试");
    //通过编辑文本框,改变Laber文本内容
    connect(edit, &QTextEdit::textChanged, [label, edit](){
        QString text = edit->toPlainText();//获取文本内容
        label->setText(text);
    });

    //补充:老版本QT4之前的 信号 和 槽 的绑定方式
    //connect(被观察者, 信号);
    //例如:点击按钮,打印文字
    auto btn10 = new QPushButton("老版本测试按钮", this);
    btn10->move(500, 500);
    connect(btn10, SIGNAL(clicked()), this, SLOT(showMaximized()));

}

Widget::~Widget()
{

}

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C,C++,QT)