Qt:信号与槽

#ifndef MY_WIDGET_H
#define MY_WIDGET_H

#include <QWidget>
#include <QPushButton>
#include "subwidget.h" //子窗口头文件

class My_Widget : public QWidget
{
    Q_OBJECT

public:
    My_Widget(QWidget *parent = 0);
    ~My_Widget();

    void mySlot();
    void changwin();
    void dealSub();

private:
    QPushButton b1;
    QPushButton *b2;
    QPushButton b3;

    Subwidget w;
};

#endif // MY_WIDGET_H

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>

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



signals:
    /*信号必须有signals关键词来声明
     * 信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需声明,无需定义
     * 使用: emit mySignal();
    */
    void mySignal();

public slots:

    void sendSlot();

private :
    QPushButton b;

};

#endif // SUBWIDGET_H

 

#include "my_widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    My_Widget w;  //执行My_Widget的构造函数
    w.show();

    return a.exec();
}

#include "my_widget.h"
#include <QPushButton>

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

    b2 = new QPushButton(this);
    b2->setText("abc");

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

    /*自定义槽,普通函数的用法
     * Qt5:任意的成员函数,普通全局函数,静态函数
     * 槽函数需要和信号一致(参数,返回值)
     * 由于信号都是没有返回值,所以,槽函数一定没有返回值
    */
    connect(b2, &QPushButton::released, this, &My_Widget::mySlot);
    connect(b2, &QPushButton::released, &b1, &QPushButton::hide);

    /*信号:短信
     * 槽函数:接收短信的手机
    */

    setWindowTitle("老大");
    //this->setWindowTitle("老大");

    b3.setParent(this);
    b3.setText("切换到子窗口");
    b3.move(50,50);

    //显示子窗口
    //w.show();
    connect(&b3, &QPushButton::released, this, &My_Widget::changwin);

    //处理子窗口的信号
    connect(&w,&Subwidget::mySignal, this, &My_Widget::dealSub);

    resize(400,300);

}

void My_Widget::mySlot()
{
    b2->setText("123");
}

void My_Widget::changwin()
{
    //子窗口显示
    w.show();
    //本窗口隐藏
    this->hide();
}

void My_Widget::dealSub()
{
    //子窗口隐藏
    w.hide();
    //本窗口显示
    show();
}

My_Widget::~My_Widget()
{

}

 

#include "subwidget.h"

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

    connect(&b, &QPushButton::clicked, this, &Subwidget::sendSlot);
    resize(400,300);
}

void Subwidget::sendSlot()
{
    emit mySignal();
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值