吃饭睡觉学QT(3)- 信号与槽(2)

#include "subwidget.h"

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
    this->setWindowTitle("xiaodi");
    b3.setText("切换到主窗口");
    b3.setParent(this);
    b3.move(100,100);

    connect(&b3,&QPushButton::clicked,this,&SubWidget::sendslot);
    //resize(400,300);
}


void SubWidget::sendslot()
{
    emit MySignal();

}


#include "widget.h"

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

    b2 = new QPushButton(this);
    b2->setText("pangRR");
    b2->move(200,100);

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


    /* 自定义槽   普通函数的用法*/
    //QT:任意的成员函数,普通全局函数,静态函数
    //   槽函数需要和信号一致
    //   由于信号没有返回值 所以槽函数也没有返回值

    connect(b2,&QPushButton::pressed,this,&Widget::my_slot);

    this->setWindowTitle("baba");

    b3.setParent(this);
    b3.setText("切换待子窗口");
    b3.move(150,200);

   // w2.show();  //显示子窗口
    connect(&b3,&QPushButton::released,this,&Widget::changeWin);  //从父窗口跳到子窗口

    connect(&w2,&SubWidget::MySignal,this,&Widget::dealsub);//从子窗口跳到父窗口

    //resize(400,300);
}

void Widget::my_slot()
{
    b2->setText("pangRR beauty...");
}

void Widget::changeWin()
{
    //子窗口显示,父窗口隐藏
    w2.show();
    this->hide();
}

void Widget::dealsub()
{
    //父窗口显示,子窗口隐藏
    this->show();
    w2.hide();

}

Widget::~Widget()
{

}
#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>


class SubWidget : public QWidget
{
    Q_OBJECT
public:
    explicit SubWidget(QWidget *parent = 0);
    void sendslot();
signals:
    //信号必须有signals关键字
    //信号只有参数 没有返回值
    //信号就是函数的声明,只需要声明 不需要定义
    //使用方法  emit mysignal();     emit是关键字

    void MySignal();
    //void sendslot();


public slots:

private:
    QPushButton b3;
};

#endif // SUBWIDGET_H

 

#ifndef WIDGET_H

#define WIDGET_H

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

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    void my_slot();
    void changeWin();
    void dealsub();
    ~Widget();
private:
    QPushButton b1;
    QPushButton *b2;
    QPushButton b3;

    SubWidget w2;
};

#endif // WIDGET_H



 

第二个部分,主要是两个窗口来回切换的实现

首先是从父窗口跳转到子窗口,新建一个窗口(右击项目 -> C++ class ->  Base class:QWidget)并命名这个窗口

 我们想要这个父窗口显示出子窗口 首先在这个父窗口里得有这个字窗口的变量,比如 SubWidget  w2,并在文件开头添加 头文件          connect(&b3,&QPushButton::released,this,&Widget::changeWin);               

 这个语句里,b3是发出信号者,第二个参数是第一个控件的操作,第三个元素是收信号者,这里也就是this,最后一个参数 是我们自定义的一个槽函数,库函数里并没有我们需要的操作,而我们跳转过后,就需要父窗口关隐藏,子窗口show,所 以我们在这个类里面写这个函数的具体操作,比如w2.show() ; this->hide();    注意点是每次写一个新的槽函数,一定要在 头文件中加上对他的声明,新定义的控件也是一样

其次反过来,从子窗口跳转到父窗口,这个难度要大一点

 首先要解决的问题,在我们这个子窗口里,并没有父窗口的变量,(只能BOSS喊小弟出去买烟,没有小弟让BOSS出去买烟 的),那如何解决呢? 我们就用到了信号这个东西(signals),在我们刚刚提到的这个新创建的窗口的头文件里就有信号 这一栏,子窗口头文件信号里首先先定义一个 void MySignal()   (信号注意事项看代码)发送一个信号就像广播一样。

 connect(&b3,&QPushButton::clicked,this,&SubWidget::sendslot);

 这个函数(在子窗口.cpp里)里 sendslot是用来发送信号的(emit)

  connect(&w2,&SubWidget::MySignal,this,&Widget::dealsub);//从子窗口跳到父窗口

 这个函数(在父窗口.cpp里)是用来和子窗口相连接的,最后一个参数是用来处理这个信号的

 (无论是哪个新的函数,都要在头文件里声明,很多次编译错误都是因为这个!!!)

其他的如果运行之后窗口大小一直在变,可以在每个.cpp里都加上这么一句话 resize(xxx,xxx);

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值