QT学习笔记

系列文章目录

信号与槽(1)


目录

系列文章目录

前言

一、信号与槽是什么?

二、信号与槽的实现

总结


前言

例如:信号与槽是QT特有的通信机制,是QT的核心内容.


一、信号与槽是什么?

        信号与槽机制的含义:每当我们发出一个信号,如果该信号有对应的槽函数,那么该槽函数就会被调用,做出相应回应。

看如下代码段:

//代码段1

  #include <QObject>

  class Counter : public QObject
  {
      Q_OBJECT

  public:
      Counter() { m_value = 0; }

      int value() const { return m_value; }

  public slots:
      void setValue(int value);

  signals:
      void valueChanged(int newValue);

  private:
      int m_value;
  };

//代码段2
connect(&a, &Counter::valueChanged, &b, &Counter::setValue);

          在上述代码段1中,我们可以看到QObject类中拥有的signals,slot函数,这两者分别代表信号与槽。我们需要注意的是signals下的函数更像是一个函数声明,不需要定义,而slots函数是一个要被调用的函数,因此需要定义!!!代码段2展示了信号与槽调用的方式,通过connect函数来实现。在connect函数调用时有一点要注意:我们调用函数调用的是地址,而不是函数本身

//错误示例
connect(&a, Counter::valueChanged(), &b, Counter::setValue());

二、信号与槽的实现

1.实现点击一个窗口中的按钮关闭该窗口:

在widgget.cpp文件中:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::close);
}

2.自定义一个信号与槽函数

信号:myclass1.h(添加一个myclass1类,以widget为基类)

class Myclass1 : public QObject
{
    Q_OBJECT
public:
    explicit Myclass1(QObject *parent = nullptr);

signals:
    void MySignal(void);
public slots:
};

槽函数:myclass2.h(添加一个myclsass2类,已widget为基类)

class Myclass2 : public QObject
{
    Q_OBJECT
public:
    explicit Myclass2(QObject *parent = nullptr);

signals:

public slots:
   
    void MySlot(int void);
};

槽函数实现:myclass2.cpp

void Myclass2:: MySlot(void){
    qDebug() << "Got signal";
}

信号与槽调用:widget.h 创建mc1,mc2两个对象

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
    Myclass1 *mc1;
    Myclass2 *mc2;
};

widget.cpp:简单的connect函数,我们无法触发信号,所以我们用一个按钮来实现信号触发

 ui(new Ui::Widget)
{
    ui->setupUi(this);
    mc1 = new Myclass1(this);
    mc2 = new Myclass2(this);
    connect(mc1,&Myclass1::MySignal,mc2,&Myclass2::MySlot);//无法触发信号
}
void Widget::on_pushButton_2_clicked()
{
    //qDebug()<<"You have just clicked the button";
    emit mc1->MySignal(num++);//emit 发送MySignal信号
}

总结

以上就是对QT信号与槽机制的简单介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值