C++Qt——信号与槽

Qt信号与槽——建立信号与槽

平常我们所见到的界面,鼠标点击一下指定的按钮,就会产生一定的效果。C++ Qt框架中的信号与槽机制是Qt进行对象间通信的一种方法,非常核心且有别于传统的回调函数或者消息传递机制。通过信号与槽,Qt能够在不同的对象之间安全地传递信息,而且这种机制是类型安全的。
信号 (Signals):信号是由对象发出的消息,告知程序发生了某个事件(如用户点击按钮)。信号仅有声明,没有定义,它们被定义在QObject或其任何子类中。当特定事件发生时,相应的信号就会被发射(emit)。例如,QPushButton类有一个clicked()信号,当用户点击按钮时,这个信号被发射。
槽 (Slots):”槽是用来响应信号的函数。当与信号相连的槽收到信号时,它就会被调用。和信号一样,槽也是QObject或其子类的成员。槽可以是普通的成员函数,也可以是lambda表达式或其他可调用的对象。
信号与槽的连接 (Connecting Signals and Slots):要使信号和槽一起工作,需要将它们连接起来。Qt提供了QObject::connect函数(静态函数)来实现这一点。当连接建立后,如果信号被发射,对应的槽就会被调用。
在这里插入图片描述

一、 简单界面

方法一 :演示新建一个QT项目。在ui设计界面,拖动一个button,下面有发送者、信号、接受者、槽,+ - 表示添加和删除。手动设置,如下的功能是点击窗口的按钮,窗口自动关闭。
在这里插入图片描述
方法二:了解即可。在下图的配置框中设置即可。

在这里插入图片描述

二、复杂事件设置信号与槽

方法一:自动连接(使用UI文件),通过命名约定自动连接信号与槽。

拖拽一个按钮,右键选择“转到槽”,选择相应的信号。
在这里插入图片描述
然后就可以在相应的函数进行操作。
在这里插入图片描述
运行点击按钮,生成结果。
在这里插入图片描述

void Widget::on_pushButton_clicked()
{
   
    std::cout << "方法一btnuiClicked" << std::endl;
}
//on_pushButton_clicked()命名的槽会自动连接到相应的信号。
//原型是on_objectName_signalName

方法二:使用QObject::connect

拖拽一个按钮
在这里插入图片描述

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
   
    ui->setupUi(this);
    //方法二:在构造函数中进行信号与槽的绑定           这里信号是个宏
    //QObject::connect(const QObject *sender, SIGNAL(signal()), const QObject *receiver, SLOT(slot()))   这里信号是个宏

    QObject::connect(ui->btnCon,SIGNAL(clicked()),this,SLOT(no_btnCon_clicked()));
    //no_btnCon_clicked() 自己命名,头文件中需要声明
}


//方法二
void Widget::no_btnCon_clicked()
{
   
    std::cout << "方法二btnConClicked" << std::endl;

}
//头文件
private slots:
    void on_btnUi_clicked();//方法一
    void no_btnCon_clicked();//自己声明,方法二

在这里插入图片描述

方法三:使用c++11Lambda表达式

拖拽按钮

在这里插入图片描述

/* 方法三:lambda表达式:
    QObject::connect(const QObject *sender, &Sender::signal,[=](){lambda body} )*/
    //lambda匿名函数,不需要头文件声明
    QObject::connect(ui->btnLambda,&QPushButton::clicked,[=](){
   
        
        std::cout << "方法三btnLambda" << std::endl;
    });

方法四:使用函数指针

直接连接信号与槽,可以利用ide的代码补全和检查错误。
在这里插入图片描述

 /*方法四:函数指针
    QObject::connect(const QObject *sender, &Sender::signal, receiver, &Recive::slot);
        */
    QObject::connect(ui->btnPointer,&QPushButton::clicked,this,&Widget::on_btnPointer_clicked);

//头文件
private slots:
    void on_btnUi_clicked();
    void no_btnCon_clicked();
    void on_btnPointer_clicked();

在这里插入图片描述
完整代码
头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <iostream>
QT_BEGIN_NAMESPACE
namespace Ui {
    class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
   
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_btnUi_clicked();
    void no_btnCon_clicked();
    void on_btnPointer_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

.cpp文件

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
   
    ui->setupUi(this);
    /*方法二:在构造函数中进行信号与槽的绑定           这里信号是个宏
    QObject::connect(const QObject *sender, SIGNAL(signal()), const QObject *receiver, SLOT(slot()))   这里信号是个宏
    */
    QObject::connect(ui->btnCon,SIGNAL(clicked()),this,SLOT(no_btnCon_clicked()));
    //no_btnCon_clicked() 自己命名,头文件中需要声明

    //===============================
    /* 方法三:lambda表达式:
    QObject::connect(const QObject *sender, &Sender::signal,[=](){lambda body} )*/
    //lambda匿名函数,不需要头文件声明
    QObject::connect(ui->btnLambda,&QPushButton::clicked,[=](){
   

        std::cout << "方法三btnLambda" << std::endl;
    });

     //===============================
    /*方法四:函数指针
    QObject::connect(const QObject *sender, &Sender::signal, receiver, &Recive::slot);
        */
    QObject::connect(ui->btnPointer,&QPushButton::clicked,this,&Widget::on_btnPointer_clicked);
}

Widget::~Widget()
{
   
    delete ui;
}


//方法一
void Widget::on_btnUi_clicked()
{
   
    std::cout << "方法一btnuiClicked" << std::endl;
}


//方法二
void Widget::no_btnCon_clicked()
{
   
    std::cout << "方法二btnConClicked" << std::endl;

}

//方法四
void Widget::on_btnPointer_clicked()
{
   
    std::cout << "方法四btnConClicked" << std::endl;

}

相关推荐

  1. qt-信号

    2024-02-20 17:06:01       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-20 17:06:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-20 17:06:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-20 17:06:01       82 阅读
  4. Python语言-面向对象

    2024-02-20 17:06:01       91 阅读

热门阅读

  1. Python | Conda常用命令

    2024-02-20 17:06:01       44 阅读
  2. docker搭建现成的靶场

    2024-02-20 17:06:01       46 阅读
  3. docker 使用运行指令讲解

    2024-02-20 17:06:01       48 阅读
  4. 制作一个简单的html网页

    2024-02-20 17:06:01       50 阅读
  5. 【Mybatis】TypeHandler使用

    2024-02-20 17:06:01       40 阅读
  6. 《Docker极简教程》--Dockerfile--Dockerfile的基本语法

    2024-02-20 17:06:01       39 阅读