C++Qt入门(2)---信号和槽

三、QT中的信号和槽

使用的方法:
connect(信号的发送者,发送的具体信号,信号的接收者,信号的处理(槽函数))

信号槽的优点:松散耦合,信号发送端和接收端本身是没有关联的,通过connect连接,将两端耦合在一起

1.点击按钮关闭窗口

QPushButton * but2 = new QPushButton("点我关闭窗口",this);
//设置按钮的大小
but2->resize(200,100);
//重置窗口的大小
resize(600,400);
//需求:点击第二个按钮,关闭窗口
//connect(信号的发送者,发送的信号(函数地址),信号的接收者,处理的槽函数(函数地址))
connect(but2,&QPushButton::clicked,this,&QWidget::close);

2.自定义信号和槽

(1)自定义信号
返回值为void,需要声明,不需要实现,可以有参数,写在signal下

#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

class Teacher : public QObject
{
    
    
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);
//自定义信号写到这里就可以了
signals:
    //自定义信号,返回值为void。只需要声明,不需要实现
    //可以有参数,可以重载
    void hungry();
    void hungry(QString food);

public slots:
};

#endif // TEACHER_H

(2)自定义槽函数
返回值为void,需要声明也需要实现,可以有参数,可以重在,写到public slot下

#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
    
    
    Q_OBJECT
public:
    explicit Student(QObject *parent = nullptr);
signals:
public slots:
    //早期版本必须写在public slot下,高级版本可以写到public或全局下
    //返回值是void,需要声明也需要实现,也可以有参数,可重载
    void treat();
    void treat(QString food);
};
#endif // STUDENT_H

(3)触发自定义的信号:使用emit关键字

emit t->hungry("abc");

(4)重载时出现的问题的解决
a)使用函数指针解决

//使用函数指针进行连接
void(Teacher::*teacher)(void) = &Teacher::hungry;
void(Student::*student)(void) = &Student::treat;
connect(t,teacher,s,student);

b)将QString转换为char*的方法

//QString转char*:先转QByteArray,再转char*
//QString自带引号,若想去除引号,则需转成char*
qDebug() << "老师想吃" << food.toUtf8().data();

3.信号连接信号

断开信号使用disconnect方法,参数与连接信号的connect方法的一样

4.拓展

(1)信号可以连接信号
(2)一个信号可以连接多个槽函数
(3)多个信号可以连接同一个槽函数
(4)信号和槽函数的参数类型必须一一对应
(5)信号的参数个数可以多余槽的参数个数

猜你喜欢

转载自blog.csdn.net/weixin_46841376/article/details/113107131