QT(2).信号和槽

信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。

connect()函数最常用的一般形式:

connect(sender, signal,receiver, slot);

参数:

sender:发出信号的对象

signal:发送对象发出的信号

receiver:接收信号的对象

slot接收对象在接收到信号之后所需要调用的函数

信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。如果不一致,允许的情况是,槽函数的参数可以比信号的少,即便如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少),但是不能说信号根本没有这个数据,你就要在槽函数中使用(就是槽函数的参数比信号的多,这是不允许的)。

#include "mainwidget.h"
#include <QPushButton>

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("boss");
    b1.setParent(this);
    b1.setText("=_=");
    b1.move(100,20);

    b2=new QPushButton(this);
    b2->setText("close");

    connect(b2,&QPushButton::pressed,this,&MainWidget::close);
    //connect(&b1,&QPushButton::pressed,this,&MainWidget::close);
    /*
    connect(sender, signal,receiver, slot);
    参数:
    sender:发出信号的对象
    signal:发送对象发出的信号(可以为函数)
    receiver:接收信号的对象
    slot:接收对象在接收到信号之后所需要调用的函数
    */
    connect(&b1,&QPushButton::released,this,&MainWidget::myslot);
    /*
    自定义槽函数
    slot:改为自己receiver中的处理函数
    */
    b3.setParent(this);
    b3.setText("change to employ");
    b3.move(200,200);
    connect(&b3,&QPushButton::released,this,&MainWidget::cgwindows);
    connect(&w,&subwdget::mysignals,this,&MainWidget::delsigenal);

    b4.setParent(this);
    b4.setText("hide b2");
    b4.move(300,300);
    connect(&b4,&QPushButton::click,&b3,&QPushButton::hide);
}
void MainWidget::myslot(){
    int flag=1;
    if(flag==1) b1.setText("hello");
    else b1.setText("=_=");
    flag=-flag;
}
void MainWidget::cgwindows(){
    this->hide();
    w.resize(500,500);
    w.show();

}
void MainWidget::delsigenal(){
    w.hide();
    this->resize(500,500);
    this->show();
}
MainWidget::~MainWidget()
{
}

 

posted @ 2021-02-21 21:55  zlj-xkbl  阅读(117)  评论(0)    收藏  举报