QT中信号与槽的常见使用

一.标准信号与槽函数

有些信号和槽的函数模板都已经被写好了,只需要调用即可

下面是一个点击按钮关闭窗口的程序

.h文件

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QPushButton>

class MyWidget : public QWidget
{
    Q_OBJECT    //使用信号与槽的时候需要用到它

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

public:
    QPushButton* pBtn1;

};

#endif // MYWIDGET_H

.cpp文件

#include "mywidget.h"

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    pBtn1 = new QPushButton(this); //指定父对象,不然按钮在窗口上是无法正常显示的
    pBtn1->setText("Close");//创建一个关闭窗口的按钮
    pBtn1->move(100,100);   //更改按钮在窗口上的位置

    //标准信号与槽函数的使用
    connect(pBtn1, &QPushButton::pressed, this, &MyWidget::close);
    /*pBtn1:信号发出者,为指针类型
     *&QPushButton::pressed 信号函数;  &发送者的类名:信号名字
     *this:信号的接收者
     *&Widget::close 槽函数,信号处理函数; &接受的类名::槽函数名称
     */

}

MyWidget::~MyWidget()
{

}

二.自定义槽函数

.h文件

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QPushButton>

class MyWidget : public QWidget
{
    Q_OBJECT    //使用信号与槽的时候需要用到它

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

public:
    QPushButton* pBtn1;

public:
    //自定义的槽函数
    void mySlot();

};

#endif // MYWIDGET_H

.cpp文件

#include "mywidget.h"


MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    pBtn1 = new QPushButton(this); //指定父对象,不然按钮在窗口上是无法正常显示的
    pBtn1->setText("Close");//创建一个关闭窗口的按钮
    pBtn1->move(100,100);   //更改按钮在窗口上的位置

    connect(pBtn1, &QPushButton::pressed, this, mySlot);
    /*自定义槽函数:
     * QT5:任意的成员函数,普通的全局函数,静态函数
     * 由于信号函数是没有返回值的,所以槽函数一定也没有返回值
     * 一般在QT5中都是使用成员函数作为槽函数
     */
}


//成员函数
void MyWidget::mySlot()
{
    this->close();
}

MyWidget::~MyWidget()
{

}

三.自定义信号与槽函数

下面是一个两个窗口相互切换的程序,点击主窗口按钮,切换到子窗口;在子窗口中点击按钮,给主窗口发送自定义信号。

mainwidget.h文件

扫描二维码关注公众号,回复: 7147332 查看本文章
#ifndef MAINWIDGET_H
#define MAINWIDGET_H

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

class MainWidget : public QWidget
{
    Q_OBJECT

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

public:
    QPushButton* pBtn1;
    SubWidget subWidget;

public:
    void ShowSubWidget();
    void DealSub();
    void DealSubWin(int, QString);

};

#endif // MAINWIDGET_H

mainwidget.cpp文件

#include "mainwidget.h"
#include <QDebug>

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("主窗口");

    pBtn1 = new QPushButton("切换到子窗口", this);
    pBtn1->move(100, 100);

    //点击按钮,显示子窗口
    connect(pBtn1, &QPushButton::pressed, this, ShowSubWidget);

    //处理子窗口发送的信号

    //不带参数的信号
    void(SubWidget::*funSignal)() = &SubWidget::mySignal;
    connect(&subWidget, funSignal, this, DealSub);

    //带有参数的信号
    void(SubWidget::*TestSignal)(int, QString) = &SubWidget::mySignal;
    connect(&subWidget, TestSignal, this, DealSubWin);


}

MainWidget::~MainWidget()
{

}

void MainWidget::ShowSubWidget()
{
    subWidget.show();
}

void MainWidget::DealSub()
{
    subWidget.hide();
    this->show();
}

void MainWidget::DealSubWin(int a, QString str)
{
    qDebug() << a;
    qDebug() << str.toUtf8().data();
}

subwidget.h文件

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>

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

signals:
    //自定义信号
    /*信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需要声明,无需定义
     * 使用emit mySignal
     * 信号可以重载
     */
    void mySignal(); //无参数的信号
    void mySignal(int, QString); //有参数的信号

public slots:

public:
    QPushButton* pBtn;

public:
    //自定义槽函数
    void sendSlot();

};

#endif // SUBWIDGET_H

subwidget.cpp文件

#include "subwidget.h"

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
    this->setWindowTitle("子窗口");

    pBtn = new QPushButton("切换到主窗口", this);
    pBtn->move(100, 100);

    connect(pBtn, &QPushButton::clicked, this, sendSlot);
}

void SubWidget::sendSlot()
{
    //当按钮按下时,子窗口向主窗口发送信号
    emit mySignal();
    emit mySignal(100, "我是子窗口");
}

猜你喜欢

转载自www.cnblogs.com/QingYiShouJiuRen/p/11442060.html