QT中的自定义信号以及自定义函数

信号与槽函数是QT的一大创新,通过自定义信号与槽函数可以实现自己想实现的功能。

标准的信号与槽写法如下:connect(&button,&QPushButton::clicked,this,&QWidget::close);

参数说明:

(1) &button :信号发出者,指针类型

(2)&QPushButton::clicked :处理的信号, &发送者的类名::信号名字 (不用加函数括号,只需要名字即可)这里说的是button的点击操作

(3) this : 信号接收者 ,指针类型 这里指的是当前窗口

(4)&QWidget::close :&接收者的类名::槽函数名字

自定义槽函数

普通函数的用法,任意的成员函数,普通全局函数,静态函数都可以作为槽函数

槽函数需要和信号一致(参数,返回值)由于信号都是没有返回值,所以槽函数一般都没有返回值

自定义信号,信号必须有signals关键字来声明

信号没有返回值,但可以有参数,信号就是函数的声明,只需声明,无需定义

使用:emit (一般都是通过自定义槽函数发送信号出去)

 

来举例说明,建立一个窗口和另一个窗口,一个作为 父窗口,另一个作为 子窗口,每个窗口上面 设置按钮,发生点击信号响应当前窗口隐藏,另一个窗口显示。

1.项目目录如下:

QT中的自定义信号以及自定义函数_第1张图片

2.代码文件:

Headers 头文件

(1)sonwidget.h文件:

#ifndef SONWIDGET_H
#define SONWIDGET_H

#include 
#include 
class Sonwidget : public QWidget
{
    Q_OBJECT
public:
    explicit Sonwidget(QWidget *parent = nullptr);
    QPushButton *button2;

    //自定义信号
signals:
    //信号没有返回值,可以有参数,信号函数不需要定义,只需要声明
    void show_hide_singal(int a);
    //自定义槽函数
public slots:
    void emit_mysignal();
};

#endif // SONWIDGET_H

(2)widget.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include "sonwidget.h"
#include "QPushButton"
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
    //类成员变量
    Sonwidget *sonwidget;//子窗口
    QPushButton *button1;//按钮

    //自定义的槽函数
public slots:
    void button_click1();//按钮响应的槽函数
    void signal();//子窗口响应的槽函数
};

#endif // WIDGET_H

 

Sources文件

(1)main.cpp

#include "widget.h"
#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

(2)sonwidget.cpp文件

#include "sonwidget.h"
#include "QPushButton"
Sonwidget::Sonwidget(QWidget *parent) : QWidget(parent)
{
    this->setWindowTitle("子窗口");
    //设置按钮
    button2=new QPushButton("显示父窗口,隐藏子窗口",this);
    //设置连接,子窗口,子窗口的信号为按钮的点击响应,槽函数为父窗口的自定义函数
    connect(button2,&QPushButton::clicked,this,&Sonwidget::emit_mysignal);
}

void Sonwidget::emit_mysignal(){
    //点击按钮的函数
    emit show_hide_singal(10);
}

(3)widget.cpp文件

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //父窗口设置标题
    this->setWindowTitle("父窗口");
    //设置当前窗口的子窗口
    this->sonwidget=new Sonwidget;
    //显示子窗口
    sonwidget->show();

    //设置按钮
    button1=new QPushButton("显示子窗口,隐藏父窗口",this);
    //设置连接,父窗口上的按钮。信号为点击按钮,槽函数为父窗口的自定义函数
    connect(button1,&QPushButton::clicked,this,&Widget::button_click1);
    //设置连接,子窗口,子窗口的信号,槽函数为父窗口的自定义函数
    connect(sonwidget,&Sonwidget::show_hide_singal,this,&Widget::signal);

}

//设置按钮连接的槽函数
void Widget::button_click1(){
    //父窗口隐藏
    this->hide();
    //子窗口显示
    this->sonwidget->show();
}

//设置子窗口连接的槽函数
void Widget::signal(){
    //父窗口显示
    this->show();
    //子窗口隐藏
    this->sonwidget->hide();
}

//类析构函数
Widget::~Widget()
{

}

 

你可能感兴趣的:(QT开发,qt,c++,槽函数,信号)