QT 信号与槽

#include "mainwidget.h"
#include <QPushButton>
#include <QDebug>//打印
MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("close");
    b1.move(200,190);

    b2 = new QPushButton(this); //如果创建的
    b2->setText("选择");
    b2->move(200,210);

    connect(&b1,&QPushButton::pressed,this,&MainWidget::close);
        /*&b1 : 信号发出者,指针类型
         * &QPuhButton::pressed 处理的信号,  &发送者的类名::信号名字
         * this:信号接收者
         * &MainWidget::close;  槽函数,信号处理函数  &接收者类名::槽函数名字
         */
    /* 自定义槽,普通函数的用法
     * QT5:任意的成员函数,普通全局函数,静态函数
     * 槽函数需要和信号一致(参数,返回值)
     *  由于信号都是没有返回值的,所以,槽函数一定没有返回值
     * 信号可以重载
     * 优点,松散耦合
     */
    connect(b2,&QPushButton::released,this,&MainWidget::mySlot);
    connect(b2,&QPushButton::released,&b1,&QPushButton::hide);

    /* 信号:短信
     * 槽函数:接收短信的手机
     */
    setWindowTitle("智能地铁换乘系统0.1");

    //设置父亲
    b3.setParent(this);
    //设置文本
    b3.setText("切换");
    //设置位置
    b3.move(200,230);
    connect(&b3,&QPushButton::released,this,&MainWidget::changewin);
    //w.show();
    //处理子窗口的信号
    void  (SubWidget::*winSignal)() = &SubWidget::mySignal;
    connect(&w,winSignal,this,&MainWidget::dealSub);

    void  (SubWidget::*stringSignal)(int,QString) = &SubWidget::mySignal;
    connect(&w,stringSignal,this,&MainWidget::dealSlot);
    setFixedSize(600,400);//设置固定窗口大小
    resize(400,300);
    //disconnect();断开信号
    //1.信号可以连接信号
    //2.一个信号可以连接多个槽
    //3.多个信号可以连接同一个槽函数
    //4.信号和槽的参数类型要一一对应
    //5.信号的参数可以多于槽函数参数

    /**************************lambda表达式*****************************/
    // [=]按值传递 ,加上mutable修饰符后,可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)

    QPushButton * myBtn = new QPushButton("来点我",this);
    QPushButton * myBtn2 = new QPushButton("再点我试试",this);
    myBtn->move(240,250);
    myBtn2->move(260,200);
    int m = 10;

    connect(myBtn,&QPushButton::clicked,this,[m]()mutable{m=100+10;qDebug()<<m;});
    connect(myBtn2,&QPushButton::clicked,this,[=](){qDebug() << m;});
    qDebug() << m;

    /***************************************************************/
    //用做返回值
    int ret = []()->int{return 1000;}();
    qDebug()<< "ret="<< ret;

}
void MainWidget::dealSlot(int a,QString str)
{
    //QString -> char * 先转成QByteArray ( .toUtf8() ) 再转成char *( .data() )
    qDebug() << a << str.toUtf8().data();
    //w.hide();
    //show();
}

MainWidget::~MainWidget()
{

}
void MainWidget::changewin()
{
    w.show();
    this->hide();

}
void MainWidget::dealSub()
{
    w.hide();
    this->show();
}
void MainWidget::mySlot()
{
    b2->setText("嘿嘿嘿");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值