当前位置 博文首页 > liuguangshibei的博客:QT学习——day5

    liuguangshibei的博客:QT学习——day5

    作者:[db:作者] 时间:2021-08-13 12:55

    QT学习——day5

    信号与槽函数的重载

    信号函数的重载

    1.信号函数:在信号函数对应类的signals下添加信号函数重载的声明。

    signals:
        void girlfriend();//原函数
        void girlfriend(QString);//重载的函数
    

    槽函数的重载

    2.槽函数重载:在槽函数对应类的public slots下添加槽函数的重载声明。

    public slots:
        void eat();
        void eat(QString);
    

    在对应的.cpp文件中添加重载函数的定义:

    void Me::eat(QString)
    {
        qDebug()<<"这是一个重载的输出!!!";
    }
    
    

    注意重载槽函数的参数与信号函数参数的关系。

    信号的发射

    法<1> 使用额外定义的一个信号发射函数,在此函数中添加重载的信号函数发射事件。

    void Mywidget::launch()//额外自定义的信号发射函数
    {
        emit fir->girlfriend();//原信号发射事件
        emit fir->girlfriend("这是一个重载的信号函数!!!");//重载的信号发射事件
    }
    

    这样只需将触发事件与发射函数connect连接一次。

     connect(ui->f_eat,&QPushButton::clicked,this,&Mywidget::launch);
    

    法<2> 直接将connect连接中的第二对参数改为要发射的信号函数。

    需将触发事件与发射函数连接两次(原函数一次重载函数一次)。

    信号的连接

    <1> QT5中的信号连接方法:

      //QT5的连接机制:
        //因为重载后的函数地址会发生变化,同一个函数名会对应多个地址,故需要不同参数函数的地址进行再定义
        //void(函数属于的类名+域作用符+自定义的*指针)(该函数对应的参数类型)=函数的地址
        void(Friend::*fr1)()=&Friend::girlfriend;
        void(Friend::*fr2)(QString)=&Friend::girlfriend;
        void(Me::*m_e1)()=&Me::eat;
        void(Me::*m_e2)(QString)=&Me::eat;
        //使用connect进行对应的连接
        connect(fir,fr1,e,m_e1);
        connect(fir,fr2,e,m_e2);
        connect(fir,fr2,e,m_e1);
    

    connect连接法制为:空对空,有对空,有对有。

    利:这种连接方法没有用到底层的宏替换,故编译器会提示报错信息。

    弊:需要重新定义每一个重载函数的地址,过程较为繁琐。

    <2> QT4中的信号连接方法:

    //统一将类实例化
    fir=new Friend;
       e=new Me;
        connect(fir,SIGNAL(girlfriend()),e,SLOT(eat()));//原函数的连接 
       connect(fir,SIGNAL(girlfriend(QString)),e,SLOT(eat(QString)));//重载函数的连接
    

    利:这种方法连接相对比较简单,代码简洁。

    弊:这种方法在底层是采用在SIGNAL与SLOT中宏替换的方式,故在书写其中参数时类似与重新定义变量,编译器不会提供检错机制,当然更不会有快捷补全,故比较容易出错。

    lambda表达式与信号发射

    lambda表达式简述

    Lambda表达式就是一个匿名函数, 语法格式如下:

    capture opt -> ret {body;};

    ? capture: 捕获列表

    • params: 参数列表
    • opt: 函数选项
    • ret: 返回值类型
    • body: 函数体
    // 示例代码->匿名函数的调用:
    int ret = [](int a) -> int
    {
    	return a + 1;
    }(100);
    
    #include <iostream>
    #include<string>
    using namespace std;
    int main()
    {
    	int a = 2;
    	auto m = [=]()mutable {
    		cout << "我是一个lambda表达式!!!" << endl;
    		return a + 1;
    	};//可以使用auto关键字进行定义与调用
    	cout << m();//类似与普通函数的调用
    	return 0;
    }//mutable该关键字表示捕获的变量可以在表达式内部进行读写操作。
    

    对于lambda的返回值,若函数体内只有一个return语句,则可以不进行显示的指定返回值类型,编译器会自动根据return的值进行判断,若没有return则返回值类型会默认为void,若函数体内有多个return语句,则必须要显示的指定返回值类型。

    在信号发射当中的调用

     connect(ui->f_eat,&QPushButton::clicked,this,[=](){
            emit fir->girlfriend();
            emit fir->girlfriend("这是一个重载信号函数的输出!!!");
        });
    
    cs
    下一篇:没有了