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

原文地址:https://www.cnblogs.com/lzy820260594/p/11352346.html

时间: 2024-10-01 04:09:02

QT学习之信号和槽的相关文章

Qt学习六 - 信号与槽

一.简介 信号和槽是Qt的核心特征.用于对象间的通信,类似观察者模式.例如当一个按钮被点击,按钮监测到自己被点击了一下,就会发送一个信号(signal).这个信号无目的,类似广播.如果我们需要处理这个信号,那么就需要使用connect来连接一个对象,使用该对象对应的槽函数(slot)来处理这个信号.也就是说,当点击按钮时,会触发与之相关联的槽函数.一个信号可以关联多个槽函数,多个信号也可以关联到一个槽函数上,甚至一个信号还可以关联到另一个信号上.当信号被发射时,这些关联的槽会一个接一个的执行,但

Qt中使用信号和槽的一点心得

信号(Signal)与槽(Slot)-Qt中的典型机制 这一篇文章中都说得很详细了,这里不再重复,只说一点在实际使用中可能会遇到的问题. 1.一个信号不要同时连接几个槽函数,不然执行的顺序是随机的,最后的结果可能会和自己期待的有出入. 2.基本上,所有的信号连接槽函数之后,会执行完当前连接的槽函数,然后再执行emit信号之后的内容.但是也会有意外的情况发生:如果当前信号里面要执行的内容过于复杂(e.g.slots中又包含emit信号,本身slots函数又比较复杂等等),会导致线程之间的混乱,可能

Qt 5中信号和槽的新语法

QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT 库的基础之上.QT 支持下列平台:MS/WINDOWS-95.98.NT 和 2000:UNIX/X11-Linux.Sun Solaris.HP-UX.Digital Unix.IBM AIX.SGI IRIX:EMBEDDED- 支持 framebuffer 的 Linux 平台.伴随着 KD

Qt中的信号和槽函数。

1:写一个close按钮当单击此按钮时就执行槽函数,而关闭窗口. 1 #include "slot.h" 2 #include <QApplication> 3 #include<QPushButton> 4 #include<time.h> 5 #ifndef SLOT_H 6 #define SLOT_H 7 #include <QMainWindow> 8 #include <QObject> 9 #include &l

Qt::ConnectionType(信号与槽的传递方式)

Qt::AutoConnection 自动连接:(默认值)如果信号在接收者所依附的线程内发射,则等同于直接连接.如果发射信号的线程和接受者所依附的线程不同,则等同于队列连接. Qt::DirectConnection 直接连接:当信号发射时,槽函数将直接被调用.无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行. Qt::QueuedConnection 队列连接:当控制权回到接受者所依附线程的事件循环时,槽函数被调用.槽函数在接收者所依附线程执行.也就是说:这种方式既可以在线程内传递

在Qt Creator 和在 vs2012 里添加信号和槽

Qt  的窗口部件通过发射信号(signal)来表明一个用户的动作已经发生了或者是一个状态已经改变了. 如点击一个QPushButton时,按钮会发送一个clicked()信号,信号可以与函数(在qt里称做槽slot)相连接 可以把信号理解为c#里的事件 在vs2012里和在Qt Creator里添加信号和槽不一样,这里把两种环境下怎么添加详细说明一下 1.在vs2012里添加信号和槽 新建一个qt的项目QtDemo 在qtdeom.h里添加槽 private slots: void Btn_O

关于qt学习的一点小记录

今日为了应付学校作业要求 决定现学qt来制作界面 毕竟c++不像在这方面c#可以那么方便 qt主要依靠信号.槽来实现类似winform中的消息 鉴于要尽快做完,故而没有细看qt 只是大概了解了下界面的制作方法 所以依然还有不少问题 好了我先从qt设计器开始了. 嗯,很好用的界面编辑器..一目了然啊~~~ 遇到的问题有: 1.槽明明在窗口类声明了,可设计器还是找不到... 解决:这个应该还需要在某些地方增加点代码,毕竟我find了一下别人demo的槽函数名字,发现出现在了好几个地方 嗯..这次时间

QT学习小结之信号与槽

信号与槽函数是我们学习QT必备的基础知识,今天跟大家分享我学习QT的一些总结吧. 信号槽机制是Qt编程的基础.通过信号槽,能够使Qt各组件在不知道对方的情形下能够相互通讯. 槽函数和普通的C++成员函数没有很大的区别.它们也可以使virtual的:可以被重写:可以使public.protected或者private的:可以由其它的C++函数调用:参数可以是任何类型的.如果要说区别,那就是,槽函数可以和一个信号相连接,当这个信号发生时,它可以被自动调用. 信号与槽函数的连接我们可以用connect

Qt 学习之路 :信号槽

信号槽是 Qt 框架引以为豪的机制之一.熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的技术设计能力. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种发出是没有目的的,类似广播.如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,用自己的一个函数(成为槽(slot))来处理这个信号.也就是说,当信号发出时,被连接的槽函数会自动被回调.这就类似观察者模式:当发生了感兴趣的事件