QT学习之信号和槽

摘要:在QT中,我们可以使用系统提供的函数实现信号和槽的链接,但是在QT中不仅仅如此,还可以让用户自己定义信号和槽函数。在本文中,我将在自己定义的teacher类下定义信号函数hungry,然后在自己定义的student类下定义槽函数treat,最后在wedget类下将两个函数进行链接、触发、显示。

1、teacher类

有信号函数,本例中就是hungry,有参数和没有参数的,其中有参数的函数中的参数代表要传递的内容

头文件:

 1 #ifndef TEACHER_H
 2 #define TEACHER_H
 3 
 4 #include <QObject>
 5 
 6 class Teacher : public QObject
 7 {
 8     Q_OBJECT
 9 public:
10     explicit Teacher(QObject *parent = 0);
11 
12 //信号 自定义的信号 写到signals 下
13 signals:
14     //信号返回值是void
15     //信号只需要声明 不需要实现
16     void hungry();
17 
18     void hungry( QString foodName );
19 
20 //槽函数可以写到public slots
21 public slots:
22 };
23 
24 #endif // TEACHER_H

源文件:

1 #include "teacher.h"
2 
3 Teacher::Teacher(QObject *parent) : QObject(parent)
4 {
5 }

2、student类

设计并实现的槽函数,用来接收信号

头文件:

 1 #ifndef STUDENT_H
 2 #define STUDENT_H
 3 
 4 #include <QObject>
 5 
 6 class Student : public QObject
 7 {
 8     Q_OBJECT
 9 public:
10     explicit Student(QObject *parent = 0);
11 signals:
12 public slots:
13     //请客的槽函数 槽函数必须要实现  并且是和hungry相对应的
14     void treat();
15     void treat(QString foodName);
16 };
17 
18 #endif // STUDENT_H

源文件:

 1 #include "student.h"
 2 #include <QDebug>
 3 Student::Student(QObject *parent) : QObject(parent)
 4 {
 5 
 6 }
 7 
 8 void Student::treat()
 9 {
10     qDebug() << "请老师吃饭了!";
11 
12 }
13 
14 void Student::treat(QString foodName)
15 {
16     //QString -> char *
17     //QString str  str.toUtf8().data();变成字符串而且不带引号
18     qDebug() << "请老师吃饭了!,老师要吃:" << foodName.toUtf8().data() ; 
19 }

3、wedget中信号和槽的链接

头文件:定义了触发函数

 1 #ifndef WIDGET_H
 2 #define WIDGET_H
 3 
 4 #include <QWidget>
 5 #include"student.h"
 6 #include"teacher.h"
 7 
 8 class Widget : public QWidget
 9 {
10     Q_OBJECT
11 
12 public:
13     Widget(QWidget *parent = 0);
14     Student *st; //设计成一个成员是方便在connect下使用
15     Teacher *zt;
16     void classover(); //触发函数
17     ~Widget();
18 };
19 
20 #endif // WIDGET_H

源文件:

使用connect实现了信号和槽的链接;还实现了用按钮触发链接,最终触发槽函数

需要注意的是区分不同种类的信号函数用函数指针、connect链接的两个函数的种类要对应(参数对应原则)、系统中的QPushButton::clicked只可以对应没有参数的函数。

触发函数要位于connect的后面,函数实现的时候借助emit,被触发的对象要明确。

 1 #include "widget.h"
 2 #include<QPushButton>
 3 
 4 Widget::Widget(QWidget *parent)
 5     : QWidget(parent)
 6 {
 7     st=new Student(this);
 8     zt=new Teacher(this);
 9 
10     connect(zt,&Teacher::hungery,st,&Student::treat);
11     //使用了函数指针来区分不同的信号函数 
12     void(Teacher::*teacherSingal1)(QString)=&Teacher::hungery;
13     void(Student::*studentSlot1)(QString)=&Student::treat;
14     void(Teacher::*teacherSingal2)(void)=&Teacher::hungery;
15     void(Student::*studentSlot2)(void)=&Student::treat;
16 //    QPushButton* btn=new QPushButton;
17 //    btn->setParent(this);
18 //    btn->setText("下课");
19 
20 //    connect(btn,&QPushButton::clicked,zt,teacherSingal2);
21     connect(zt,teacherSingal1,st,studentSlot1);
22     connect(zt,teacherSingal2,st,studentSlot2);
23     classover();
24 }
25 void Widget::classover(){
26     emit zt->hungery();  //触发函数的实现
27     emit zt->hungery(QString("宫保鸡丁"));
28 }
29 
30 Widget::~Widget()
31 {
32 
33 }

4、其他的一些关于信号和槽的小知识

1)信号和槽不仅可以链接,还可以断开,断开借助函数disconnect

1  disconnect(zt,teacherSingal1,st,studentSlot1);

2)一个信号可以触发多个槽函数:

1 connect(btn,&QPushButton::clicked,zt,teacherSingal2);
2 connect(btn,&QPushButton::clicked,this,&Widget::close);

上面的程序可以实现显示信息,同时关闭窗口

3)多个信号也可以链接同一个槽函数

4)信号和槽函数的参数必须一一对应,信号的参数可以多于槽函数,反之不可以,参数的类型和位置要一一对应。

猜你喜欢

转载自www.cnblogs.com/lzy820260594/p/11352346.html