QT学习笔记(二)——信号与槽

一、引入

       上一篇笔记,我们只是单纯的创建了一个按钮,就相当于是摆设一样并没有加入什么功能。那么现在我们引入信号与槽机制让按钮“动起来”。

二、信号与槽介绍

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

      上一篇笔记我们已经创建了这个按钮界面:

                               

只是这个界面,我们点击这两个按钮是没有变化的,那我们加入一个简单的信号在看一下:

    QObject::connect(&button1,SIGNAL(clicked(bool)),&a,SLOT(quit()));

这时候我们点击按钮1,widget这个界面就关闭了。

函数原型为:QObject::connect(const QObject *,const char*,const OBject *,const char*);    QObject是Qt中所有类的父类,connect()是Qt类都会有的函数。同时这个函数也是我们最常用的函数,参数说明:第一个参数:发送信号的对象;第二个参数:发送对象发送的信号;第三个参数:接收信号的对象;第四个参数:接收对象在接收到信号之后所需要调用的函数。特别说明:因为我使用的是Qt4所以signal和slot只有const char *这么一种形式。这里我们使用了两个宏SIGNAL和SLOT将这两个函数名转化为字符串。

三、自定义信号槽

先看效果:点击打开会得到一个新的窗口

代码:recevie.h

#ifndef RECEVIE_H
#define RECEVIE_H

#include <QObject>
#include <QWidget>
#include <QDialog>
#include <QPushButton>

class Recevie : public QDialog
{
    Q_OBJECT
public:
    Recevie();
};

#endif // RECEVIE_H

recevie.cpp

#include "recevie.h"

Recevie::Recevie()
{
    this->setWindowTitle("窗口2");
    QPushButton *button1 = new QPushButton("haha",this);
    button1->move(100,100);
}

signal_self.h

#ifndef SIGNAL_SELF_H
#define SIGNAL_SELF_H

#include <QWidget>
#include <QPushButton>
#include "recevie.h"

class Signal_self : public QWidget
{
    Q_OBJECT

public:
    Signal_self(QWidget *parent = 0);
    ~Signal_self();
public slots:
    void slot_new_widget();
};
#endif // SIGNAL_SELF_H

signal_self.cpp

#include "signal_self.h"

Signal_self::Signal_self(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("窗口1");
    QPushButton *button1 = new QPushButton("打 开",this);
    QPushButton *button2 = new QPushButton("退 出",this);

    button1->move(100,100);
    button2->move(100,150);
    this->connect(button1,SIGNAL(clicked(bool)),this,SLOT(slot_new_widget()));
}

void Signal_self::slot_new_widget()
{
    Recevie widget1;
    widget1.exec();
}

Signal_self::~Signal_self()
{

}

特别说明: 发送者和接收者都需要是 QObject 的子类(当然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外)。

后面Qt的学习还有使用很多的信号和槽机制,多用用很快就会熟练啦!!!

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值