QT自定义信号和槽

Posted chechen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT自定义信号和槽相关的知识,希望对你有一定的参考价值。

最近项目中使用到QT,在此记录一下QT的核心,信号与槽:

 QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

sender:信号发出者

signal:发送信号

receiver:信号接收者

method:信号处理者

新建一个QT窗口,在窗口上放一个按钮,点击按钮然后关闭窗口

SignalAndSlot.h

#include <QtWidgets/QWidget>
#include "ui_SignalAndSlot.h"
#include <QPushButton>

class SignalAndSlot : public QWidget
{
    Q_OBJECT

public:
    SignalAndSlot(QWidget *parent = Q_NULLPTR);

private:
    QPushButton b1;

private:
    Ui::SignalAndSlotClass ui;
};

SignalAndSlot.cpp

#include "SignalAndSlot.h"

SignalAndSlot::SignalAndSlot(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    b1.setParent(this);
    b1.setText(QStringLiteral("关闭"));//QStringLiteral解决VS中文乱码
    b1.move(100, 100);

    connect(&b1, &QPushButton::released, this, &SignalAndSlot::close);
}

技术图片

 

 

一. 槽函数:

QT5:任意的成员函数,普通全局函数,静态函数
     槽函数需要和信号一直(参数,返回值)
     由于信号没有返回值,所以槽函数一定没有返回值

我们自定义槽函数
void closeWidget(); //自定义槽函数
//槽函数里执行关闭操作
void SignalAndSlot::closeWidget() 
{
     close();
}

.....

connect(&b1, &QPushButton::released, this, &SignalAndSlot::closeWidget);//自定义槽函数

二.自定义信号实例

 我们实现两个窗口互相切换,在主创中新建一个按钮,叫切换到子窗口(这个过程是子窗口显示,主窗口隐藏), 新建一个QT子窗口,子窗口上有一个按钮叫切换到主窗口(子窗口隐藏,主窗口显示);

1.新建子窗口

技术图片

 

 

 技术图片

技术图片

 

 

 

 

 

 2.在主窗口中定义SubWidget窗口成员变量和主窗口的切换函数

技术图片

 

 

 技术图片

 

 

 这样实现,就可以从主窗口切换到子窗口。

3.从子窗口切换到主窗口

在子窗口定义信号和发送信号的槽函数

SubWidget.h

#include <QWidget>
#include "ui_SubWidget.h"

class SubWidget : public QWidget
{
    Q_OBJECT

public:
    SubWidget(QWidget *parent = Q_NULLPTR);
    ~SubWidget();

signals:
    /*
    * 信号必须有signals 关键字来声明
    * 信号没有返回值,但可以有参数
    * 信号就是函数声明,只需声明,无须实现
    * 使用:emit mysignal();
    * 信号可以重载
    */
    void MySignal();

public:
    void SendSignal();//发送信号的槽

private:
    Ui::SubWidget ui;
};

SubWidget.cpp

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


SubWidget::SubWidget(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    QPushButton* pChange = new QPushButton(this);
    pChange->setText(QStringLiteral("切换到主窗口"));
    pChange->move(100, 0);

    connect(pChange, &QPushButton::released, this, &SubWidget::SendSignal);//点击按钮,槽函数触发一个信号

}

SubWidget::~SubWidget()
{
}

void SubWidget::SendSignal()
{
    emit MySignal();
}

4.在主窗口里面处理这个自定义信号

技术图片

 

 

 

....

connect(&sub, &SubWidget::MySignal, this, &SignalAndSlot::DealSubSignal);
}


void SignalAndSlot::DealSubSignal()
{
    show();
    sub.hide();
}

效果:

技术图片

 

以上是关于QT自定义信号和槽的主要内容,如果未能解决你的问题,请参考以下文章

qt自定义信号和槽函数 emit

Qt信号和槽的问题

qt自定义信号和槽 在槽中怎么传输字符串

qt信号和槽机制的问题

Qt信号槽如何附带自定义参数

QT的信号和槽