qt5-信号和槽

自定义信号和槽

win.h

#ifndef WIN_H
#define WIN_H

#include <QWidget>
#include <QDebug>
#include <QPushButton>

class Win : public QWidget
{
    Q_OBJECT

public:
    Win(QWidget *parent = nullptr);
    ~Win();

signals:   //信号标记
    void sigFunc(void);//自定义信号函数,只需声明,不能写定义
public slots:  //槽标记
    void slotFunc(void);  //自定义槽函数
        //槽函数也可以当做普通的成员函数,直接调用

};
#endif // WIN_H

win.cpp

#include "win.h"

Win::Win(QWidget *parent)
    : QWidget(parent)
{

    connect(this,SIGNAL(sigFunc()),this,SLOT(slotFunc()));//信号连接槽函数
    emit sigFunc(); //发射信号
}

Win::~Win()
{
}

void Win::slotFunc()
{
    qDebug()<<"自定义槽函数";
}

 

但是信号却没有函数体定义,另外,信号的返回类型都是 void,不要指望能从信号返回什么有用信息

槽可以有参数,但槽的参数不能有缺省值

槽也能够声明为虚函数

信号与槽函数的连接 

#include <QApplication>
#include <QPushButton>
#include <QWidget>
#include <QLabel>
 
int main(int argc,char **argv)
{
    QApplication app(argc,argv);  
    QWidget win;
    win.resize(400,200);
    QPushButton button("按钮",&win);
    button.move(10,10);
    QLabel label("标签",&win);
    label.move(10,100);
    win.show();
    
    //实现点击按钮关闭标签
    QObject::connect(&button,SIGNAL(clicked(void)),&label,SLOT(close(void)));//信号连接槽函数
        
    return app.exec();  
}
/*
QObject::connect(
const QObject *sender,     //信号发送对象,可以是QObject的所有子类
const char *signal,        //信号函数
const QObject *receiver,  //信号接受对象,可以是QObject的所有子类
const char *method,       //槽函数
Qt::ConnectionType type = Qt::AutoConnection)  //连接类型--枚举类型
参数5:Qt::AutoConnection   根据signal和slot所处的线程自动决定--默认
        Qt::DirectConnection   是直接连接。相当于直接调用slot函数
*/

/*
SIGNAL(信号函数(参数表))     //将信号函数转换为const char*
SLOT(槽函数(参数表))         //将槽函数转换为const char*
*/

一个信号可以同时连接多个槽函数

多个信号可以同时连接到同一个槽函数 

两个信号函数可以直接连接

QObject::connect(A1,SIGNAL(sigfunc1(int)),A2,SIGNAL(sigfunc2(int)));

当A1发送信号时,所连接的A2对象的信号也将被发送

 

断开连接

bool b=disconnect(button,SIGNAL(clicked(void)),this,SLOT(f(void))); //断开连接
    //如果连接成功断开,则返回 true;否则返回 false
    //当所涉及的任何一个对象被销毁时,信号槽连接被移除
    //0 可以用作通配符,分别表示“任意信号”、“任何接收对象”或“接收对象中的任何槽”,sender发送者永远不会是0
    

  

第五个参数:看 https://www.cnblogs.com/senior-engineer/p/7905822.html   

 

 

qt5格式

使用SIGNAL和SLOT是qt4格式

 

win.h

#ifndef WIN_H
#define WIN_H

#include <QWidget>
#include <QPushButton>
#include <QDebug>

class win : public QWidget
{
    Q_OBJECT

public:
    win(QWidget *parent = nullptr);
    ~win();

    QPushButton* button;

public slots:
    void slotFunc(void);



};
#endif // WIN_H

 

win.cpp

#include "win.h"

win::win(QWidget *parent)
    : QWidget(parent)
{

    this->resize(400,300);

    button=new QPushButton("确定",this);
    QObject::connect(button, &QPushButton::clicked,this, &win::slotFunc);

}

win::~win()
{
}

void win::slotFunc()
{
    qDebug()<<"槽函数";
}

 

子类注意事项

如果不打钩,会找不到槽函数

 

 

 

 

 

 

 

posted @ 2019-08-28 14:32  天子骄龙  阅读(482)  评论(0编辑  收藏  举报