4、自定义槽函数、自定义信号

1、创建两个窗口,分别点击对方窗口中的一个按牛,隐藏自己 显示对方

2、主窗口MainWindow、子窗口subWind,主窗口可以让子窗口隐藏,但是子窗口不可以让主窗口隐藏

#include <QMainWindow>
#include <QPushButton>
#include "subwind.h"  // 将子窗口包含进来

// 在头文件中添加
void changwind_slot();  // 主窗口按钮槽函数
void dealsignal();      // 处理子窗口发过来信号的槽函数
QPushButton b1;  // 主窗口按钮对象
subwind w;       // 子窗口对象,与b1相对于主窗口一样,具有相同的属性 可当做b1使用

3、在主窗口的构造函数中实现

 b1.setParent(this);
    b1.setText("切换到小弟");
    b1.move(50,50);
    b1.resize(80,40);
    this->setWindowTitle("老大");
    this->resize(300,400);
    // 处理按钮信号
connect(&b1,&QPushButton::pressed,this,&MainWindow::changwind_slot);
    // 处理小弟发过来的信号
connect(&w,&subwind::mysignals,this,&MainWindow::dealsignal);
}
// 槽函数实现
void MainWindow::dealsignal()
{
    // 显示主窗口
    show();
    // 隐藏子窗口
    w.hide();
}
// 槽函数 实现
void MainWindow::changwind_slot()
{
    // 隐藏主窗口
    hide();
    // 显示子窗口
    w.show();
}

4、子窗口头文件中实现

private:
    QPushButton b;
signals:
    void mysignals();  // 自定义信号
    /* 信号可以传递参数,也可以不传参数
     * 信号没有返回值
     * 必须使用关键字signals声明
     * 只需声明,不能实现,编译器会自动实现
     * 调用:emit  mysignals();
     */

public slots:
    void sendsignal();  // 自定义槽函数 处理按钮b的信号,以发送槽函数

5、子窗口构造函数中实现

subwind::subwind(QWidget *parent) : QWidget(parent)
{
    setWindowTitle("小弟");
    b.setParent(this);
    b.setText("切换到老大");\
    b.move(100,100);
    // 处理按钮发送的信号
    connect(&b,&QPushButton::released,this,&subwind::sendsignal);
}
// 自定义槽函数
void subwind::sendsignal()
{
    emit mysignals();
}

6、connect理解,属于Qt核心机制之一,广泛应用于类间通信

connect(A,B,C,D)
// 四个位置的参数分别说明
A:发送信号者,来自于哪一个控件、对象、类
B:A对象发送哪一个信号;
C:哪一个对象、控件接收B信号
D:C接收了B信后,需要做什么样的动作

 7、信号重载

signals:
    void mysignals();
    void mysignals(int,QString); // 带参数的信号
    /*信号必须有signals关键字
     * 信号没有返回值,但可以有参数
     * 信号就是函数的声明 只需声明 无需定义
     * 使用 emit mysignals();
     * 信号可以重载
     * 信号给槽函数传参数
     */
public slots:     // 发送信号的槽函数
    void myslot();

8、处理重载的信号,重载信号需要解决如何分辨是哪一个信号,通过信号传递的参数,进行分辨

// 函数指针用法
void fun()
{
}

// 定义一个函数指针
void (*p)()= fun;

// 处理函数重载 使用函数指针
void (SubWidget::*testsigl)() = &SubWidget::mysignals;
connect(&w,testsigl,this,&mainWidget::dealsubwin);

void (SubWidget::*paramsignal)(int ,QString) = &SubWidget::mysignals;
connect(&w,paramsignal,this,&mainWidget::dealslot);

// 处理带参数信号的 槽函数
void mainWidget::dealslot(int a,QString str)
{
    qDebug()<<a<<str.toUtf8().data();  // qt4可以不用转换,qt5需要转换
    // .toYTF8()转到字节数组
    // .data转到char*
}

 

 

 
posted @ 2020-07-30 00:21  笑不出花的旦旦  阅读(188)  评论(0)    收藏  举报