QT之Connect信号与槽的连接函数

一、不用写connect:

Qt信号和槽函数的命名是有规则的,组成为on_对象名_信号,以按钮为例,如果对象名为pushButton,在你在写槽函数的时候按照这种规则,则

在头文件中添加:

private slots:

void on_pushButton_clicked();

在.cpp文件下面的构造函数中就不用写connect了,直接写槽函数的实现就能实现信号和槽的连接。

二、自定义:以按钮为例,使用connect

在头文件中添加:

private slots:

void on_button1_clicked();

在.cpp文件下面的构造函数中添加:

connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(on_button1_clicked()));

2.1最常规的用法:
信号可以是插件自带的,也可以是自己定义的如:

 //新建一个按钮
    QPushButton * btn = new QPushButton(this);
    btn->setText("设置");
    //将信号和槽连接 其中btnclicked()为自定义的槽函数
    connect(btn, SIGNAL(clicked()), this, SLOT(btnclicked()));

2.2 connect()函数基于函数指针的重载形式:

这是QT5中加入的一种重载形式,指定信号和槽两个参数不再使用SIGNAL()和 SLOT()宏,并且槽函数不再必须是使用slots关键字声明的函数,可以是任意能和信号关联的成员函数。要使一个成员函数可以和信号关联,那么这个函数的参数数目不能超过信号的参数数目,但是并不要求该函数拥有的参数类型和信号中对应的参数类型完全一致,只需要可以进行隐式转换即可。如:

connect(dlg, &mydialog::dlgReturn, this, &Widget::showValue);

在这里插入图片描述
在这里插入图片描述
可以从父类(QPushButton)取 也可以从子类(MyPushButton)取
QT之Connect信号与槽的连接函数_第1张图片
使用这种方式与前一种相比,还有一个好处就是可以在编译时进行检查,信号或槽的拼写错误、槽函数参数数目多于信号的参数数目等错误在编译时就能够被发现。所以在qt5中建议使用这种关联形式。

2.3. 带参数的信号和槽函数
当信号的参数与槽函数的参数数量不同时,只能是信号的参数数量多于槽函数的参数数量,且前面相同数量的参数类型应一致,信号中多余的参数会被忽略。


//信号:
void mySignal(int a, float b);
 
//槽:
void MainWindow::mySlot(int b)
{
//do something!!
}
 
//信号槽:
connect(this, SIGNAL(mySignal(int, float)), this, SLOT(mySLot(int)));
 
//发送信号:
emit mySignal(5, 2.2)

2.4 connect 应用c++11 lamda

另外依据上一种形式,还支持C++11 中的lambda表达式,可以在关联时直接编写信号发射后要执行的代码,例如程序中的关联可以写为:

connect(dlg, &MyDialog::dlgReturn, [ = ](int value){
ui->label->setText(tr("获取的值是:%1")arg(value));});

引用一个应用例子理解上述的几种方法:


#include "widget.h"
#include "ui_widget.h"
#include 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
 
    // 传统Qt是连接方式
    // 传统Qt4连接方式为 信号发送者,信号,信号接受者,处理函数
    QObject::connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(qT4_slot()));
 
    //Qt5连接方式
    //其实这么写的方式和Qt4没有啥却别,只是在Qt4 中引用了信号槽,在简单的使用时没有问题,但是在庞大的工程中,信号和曹 仅仅是宏替换,在编译的时候没有安全监测
    //Qt5的新方法,在编译的时候就会有监测,如果我们手误操作失误,就会出现问题
    QObject::connect(ui->pushButton_2,&QPushButton::clicked,this,&Widget::qT5_slot);
 
 
 
    //Qt5 Lambda表达式
    //这里需要注意 Lambda表达式是C++ 11 的内容,所以,需要再Pro项目文件中加入 CONFIG += C++ 11
    QObject::connect(ui->pushButton_3,&QPushButton::clicked,[=](){qDebug()<<"lambda 表达式";});
 
 
 
}
 
Widget::~Widget()
{
    delete ui;
}
 
void Widget::qT4_slot()
{
    qDebug()<< "This is Qt 4 Connect method";
}
 
void Widget::qT5_slot()
{
    qDebug()<< "This is Qt 5 Connect method";
}
————————————————
版权声明:本文为CSDN博主「ppipp1217」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/p942005405/article/details/100717064

你可能感兴趣的:(c++)