QT学习之信号和槽
Posted lzy820260594
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)信号和槽函数的参数必须一一对应,信号的参数可以多于槽函数,反之不可以,参数的类型和位置要一一对应。
以上是关于QT学习之信号和槽的主要内容,如果未能解决你的问题,请参考以下文章