zoukankan      html  css  js  c++  java
  • 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)信号和槽函数的参数必须一一对应,信号的参数可以多于槽函数,反之不可以,参数的类型和位置要一一对应。

  • 相关阅读:
    Spring Boot初学
    Spring MVC必须知道的执行流程
    日志Log4j使用
    SpringMVC处理中文乱码
    Maven设置阿里云镜像
    Maven项目中配置文件导出问题
    使用Limit实现分页
    web项目中设置首页
    JVM 学习笔记记录
    Python内存管理&垃圾回收机制
  • 原文地址:https://www.cnblogs.com/lzy820260594/p/11352346.html
Copyright © 2011-2022 走看看