Qt

Qt信号和槽——父子窗口切换

对象之间的通信机制。这种机制,要能够给两个不同对象中的函数建立映射关系,前者被调用时,后者也能自动被调用
1.标准信号与槽

connect(&b1,&QPushButton::pressed,this,&MainWidget::close);
//&b1:信号发出者,指针类型
    //&QPushButton::pressed:处理的信号, &发送者的类名::信号名字
    //this:信号接受者
    //&MainWidget::colse:槽函数,信号处理函数 &接收的类名::槽函数名字

2.自定义槽
Qt5:任意的成员函数,普通全局函数,静态函数
槽函数需要和信号一致(参数,返回值)
由于信号都是没有返回值,所以,槽函数一定没有返回值

connect(b2,&QPushButton::released,this,&MainWidget::mySlot);//由于b2本身是一个指针,所以不用&符号
connect(b2,&QPushButton::released,&b1,&QPushButton::hide);//一个信号对应多个处理槽函数是可以的
    /*信号:短信
     * 槽函数:接受短信的手机
     */
     void MainWidget::mySlot()
{
    b2->setText("123");
}

注意:Qt4槽函数必须有slots关键字来修饰
3.自定义信号
注意:声明信号必须要用关键字signals, 信号没有返回值,但可以有参数,信号就是函数的声明,只需声明无需定义,使用时:emit +信号名,信号可以重载

//声明
signals:
    void mySignal();
    void mySignal(int,QString);
    
connect(&b,&QPushButton::clicked,this,&SubWidget::sendSlot);//发送信号,按下按钮就发送一个信号
void SubWidget::sendSlot()
{
    emit mySignal();//发送信号,就掉用槽函数处理函数
}
//处理信号
 connect(&w,SIGNAL(mySignal()),this,SLOT(dealSub()));//Qt4的信号处理
 connect(&w,&SubWidget::mySignal,this,&MainWidget::dealSub);


4.完整代码

main.cpp
#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>
#include"subwidget.h"

class Widget : public QWidget
{
    Q_OBJECT

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

    void  mySlot();
    void changewin();
    void dealSub();
private:
    QPushButton b1;
    QPushButton *b2;
    QPushButton b3;
    Subwidget w;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include<QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("close");
    b1.move(100,100);

    b2 = new QPushButton(this);//函数传参
    b2->setText("abc");
    connect(&b1,&QPushButton::pressed,this,&Widget::close);
    connect(b2,&QPushButton::released,this,&Widget::mySlot);
    connect(b2,&QPushButton::released,&b1,&QPushButton::hide);
    setWindowTitle(" big boss");
    b3.setParent(this);
    b3.setText("切换到子窗口");
    b3.move(50,50);

   // w.show();
    connect(&b3,&QPushButton::released,this,&Widget::changewin);

    connect(&w,&Subwidget::mySignal,this,&Widget::dealSub);

    resize(400,300);
}
void Widget::dealSub()
{
    w.hide();
    this ->show();
}
void Widget::changewin()
{
    w.show();
    this->hide();
}
void Widget::mySlot()
{
    b2->setText("123");
}

Widget::~Widget()
{
}
subwidget.h
#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>


class Subwidget : public QWidget
{
    Q_OBJECT
public:
    explicit Subwidget(QWidget *parent = nullptr);

    void sendSlot();
private:
    QPushButton b;
signals:
    void mySignal();

};

#endif // SUBWIDGET_H
subwidget.cpp
#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>


class Subwidget : public QWidget
{
    Q_OBJECT
public:
    explicit Subwidget(QWidget *parent = nullptr);

    void sendSlot();
private:
    QPushButton b;
signals:
    void mySignal();

};

#endif // SUBWIDGET_H



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值