Qt -- 带参数的信号

信号可以重载
这里,重载mySignal这个函数,并带有两个参数。
在subwidget.h中

// signals是Qt中特有的关键字,最终会转化成C++中语法样式。
signals:
    /* 信号必须有signals关键字来声明
     * 信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需声明,无需定义
     * 使用时:emit mySignal();
     * 信号可以重载
    */

    void mySignal();
    void mySignal(int,QString);
    //重载mySignal这个函数,带有两个参数,QString相当于C++中的String,只不过功能会更强一些。

然后这两个信号都可通过 subwidget.cpp 中的自定义槽函数 sendSlot 发送出去。

#include "subwidget.h"

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
    this->setWindowTitle("小弟");
    b.setParent(this);//指定当前窗口为父对象
    b.setText("切换到主窗口");

    connect(&b,&QPushButton::clicked,this,&SubWidget::sendSlot);
    this->resize(400,400);
}

void SubWidget::sendSlot()
{
     emit mySignal();
     emit mySignal(250,"我是子窗口");
}

当主窗口对象接收到子串口发送过来的信号,并且想要进行相应的处理的时候就可以使用connect函数进行将两者关联。

在mainwidget.cpp中

connect(&subw,&SubWidget::mySignal,this,&MainWidget::changeSubWindow);
connect(&subw,&SubWidget::mySignal,this,&MainWidget::dealSubWindow);

但是如果直接这样操作将会产生二义性。
因此,我们需要分别定义一个函数指针来指向它们,此外,在定义的时候还需要加上作用域。

    // 如果直接使用函数名,将会产生二义性
    // 因此需要分别定义一个函数指针来指向它们,此外,在定义的时候还需要加上作用域
    void (SubWidget::*funSignal)() = &SubWidget::mySignal;
    // 处理子窗口发送过来的信号。
    connect(&subw,funSignal,this,&MainWidget::changeSubWindow);

    void (SubWidget::*printSignal)(int,QString)= &SubWidget::mySignal;
    // 处理子窗口发送过来的信号。
    connect(&subw,printSignal,this,&MainWidget::dealSubWindow);

这里的自定义槽函数changeSubWindow的功能是:
主窗口显示,子窗口隐藏

dealSubWindow的功能是:
打印参数–看看参数是不是真的传过来了

void MainWidget::changeSubWindow()
{
    //主窗口显示,子窗口隐藏
    subw.hide();
    this->show();
}

void MainWidget::dealSubWindow(int a,QString str)
{
    // 打印参数--看看参数是不是真的传过来了
    // 需要添加一个头文件#include <QDebug>
    // 与C++中的输出函数cout用法一样
    qDebug() << a << str;
}

这两个槽函数定义好之后,还要记得在mainwidget.h中进行声明。

上述定义多个函数指针的方法是有一点麻烦的,而在QT4中的信号连接是相对简单一些的。可以进行选择不同的信号。
在这里插入图片描述
但是,也有局限性。
在这里插入图片描述
就是槽函数在声明的时候都必须使用slots关键字来进行修饰,同时还要添加权限。
在mainwidget.h中

public slots:
    void mySlot();
    void changeWindow();
    void changeSubWindow();
    void dealSubWindow(int,QString);

但是,使用Qt4这种方式容易出错,比如
这里的槽函数changeSubWindow和dealSubWindow没有加括号,也不会报错,程序正常运行。
因为,SIGNAL和SLOT会将函数名称转化为字符串,也就不进行错误检测了。

connect(&subw,SIGNAL(mySignal()),this,SLOT(changeSubWindow));
connect(&subw,SIGNAL(mySignal(int,QString)),
             this,SLOT(dealSubWindow));

应该写成

connect(&subw,SIGNAL(mySignal()),this,SLOT(changeSubWindow()));
connect(&subw,SIGNAL(mySignal(int,QString)),
             this,SLOT(dealSubWindow(int,QString)));

所以,当工程文件非常大的时候,使用Qt5的方式更保险一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuechanba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值