博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
信号和槽
阅读量:4346 次
发布时间:2019-06-07

本文共 3691 字,大约阅读时间需要 12 分钟。

 1) 信号的定义必须在signals:保留字下,并且不需要实现

2)槽的定义必须在slots:保留字下,需要实现

3)信号和槽通过QObject::connect函数连接

4)当信号被触发时,槽函数被调用

需要注意的是:

1)信号和槽,是QT的拓展,所以实现信号和槽的类,必须是QObject的子类

2)实现信号和槽的类,必须以宏Q_OBJECT开始

3)连接信号和槽,要用到SIGNAL和SLOT宏,转换函数为字符串

4)一个信号可以和多个槽连接,槽函数调用的顺序是不确定的

5)多个信号可以同时连接一个槽

6)信号可以连接信号,形成信号传导

7) 当信号与槽函数的参数数量相同时,它们参数类型要完全一致。

  当信号的参数与槽函数的参数数量不同时,只能是信号的参数数量多于槽函数的参数数量,且前面相同数量的参数类型应一致,信号中多余的参数会被忽略。

8)信号和槽都可以重载

9)信号和槽都可以有默认参数

10)槽函数可以像普通函数一样被调用

11)在槽函数中,调用sender可以获得信号调用者

 

总结下:

一个类:QObject信号和槽都是这个类的子类

三个宏:Q_OBJECT SIGNAL SLOT

三个保留字:signals, slots, emit

 

在 Qt 5 中,QObject::connect()有五个重载:

1 //第一个,sender 类型是const QObject *,signal 的类型是const char *,receiver 类型是const QObject *,slot 类型是const char *。这个函数将 signal 和 slot 作为字符串处理 2 QMetaObject::Connection connect(const QObject *, const char *, 3                                 const QObject *, const char *, 4                                 Qt::ConnectionType); 5  6 //第二个,sender 和 receiver 同样是const QObject *,但是 signal 和 slot 都是const QMetaMethod & 7 QMetaObject::Connection connect(const QObject *, const QMetaMethod &, 8                                 const QObject *, const QMetaMethod &, 9                                 Qt::ConnectionType);10 11 //第三个,sender 同样是const QObject *,signal 和 slot 同样是const char *,但是却缺少了 receiver。这个函数其实是将 this 指针作为 receiver12 QMetaObject::Connection connect(const QObject *, const char *,13                                 const char *,14                                 Qt::ConnectionType) const;15 16 //第四个,sender 和 receiver 也都存在,都是const QObject *,但是 signal 和 slot 类型则是PointerToMemberFunction。看这个名字就应该知道,这是指向成员函数的指针17 QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,18                                 const QObject *, PointerToMemberFunction,19                                 Qt::ConnectionType)20 21 //第五个,前面两个参数没有什么不同,最后一个参数是Functor类型。这个类型可以接受 static 函数、全局函数以及 Lambda 表达式22 QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,23                                 Functor);

 注意:用lambda表达式在.pro中加入 CONFIG += C++11

 

QT4我们使用了SIGNAL和SLOT这两个宏,将两个函数名转换成了字符串。注意,即使quit()是QApplication的 static 函数,也必须传入一个对象指针。这也是 Qt 4 的信号槽语法的局限之处。另外,注意到connect()函数的 signal 和 slot 都是接受字符串,因此,不能将全局函数或者 Lambda 表达式传入connect()。一旦出现连接不成功的情况,Qt 4 是没有编译错误的(因为一切都是字符串,编译期是不检查字符串是否匹配),而是在运行时给出错误。这无疑会增加程序的不稳定性。

eg:

1 #include 
2 #include
3 #include
4 #include
5 #include
6 7 8 int main(int argc,char **argv) 9 {10 QApplication app(argc,argv);11 12 QWidget w;13 w.setWindowTitle("Enter your age");14 15 QSpinBox *spinbox = new QSpinBox(&w);16 QSlider *slider = new QSlider(Qt::Horizontal,&w);17 spinbox->setRange(0,130);18 slider->setRange(0,130);19 20 /*21 //QT4的写法,使用SIGNAL和SLOT,22 QObject::connect(slider,SIGNAL(valueChanged(int)),spinbox,SLOT(setValue(int)));23 QObject::connect(spinbox,SIGNAL(valueChanged(int)),slider,SLOT(setValue(int)));24 */25 26 //QT5的写法,用指向成员函数的指针27 QObject::connect(slider,&QSlider::valueChanged,spinbox,&QSpinBox::setValue);28 29 //如果不加下面一行会报错,原因是QSpinBox的确有两个信号:void valueChanged(int)和void valueChanged(const QString &)30 //使用 Qt 4 的SIGNAL和SLOT宏,因为这两个宏已经指定了参数信息,所以不存在这个问题,解决方法使用函数指针显式指定使用哪一个信号31 void(QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;32 QObject::connect(spinbox,spinBoxSignal,slider,&QSlider::setValue);33 34 35 spinbox->setValue(44);36 37 QHBoxLayout *layout = new QHBoxLayout;38 layout->addWidget(spinbox);39 layout->addWidget(slider);40 w.setLayout(layout);41 w.show();42 43 return app.exec();44 }

 

转载于:https://www.cnblogs.com/raichen/p/5063786.html

你可能感兴趣的文章
小D课堂 - 新版本微服务springcloud+Docker教程_3-05 服务注册和发现Eureka Server搭建实战...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_4-05 微服务调用方式之feign 实战 订单调用商品服务...
查看>>
UI基础--烟花动画
查看>>
Android dex分包方案
查看>>
ThreadLocal为什么要用WeakReference
查看>>
删除本地文件
查看>>
FOC实现概述
查看>>
gethostbyname与sockaddr_in的完美组合
查看>>
旋转变换(一)旋转矩阵
查看>>
thinkphp3.2.3 bug集锦
查看>>
C# 创建 读取 更新 XML文件
查看>>
KD树
查看>>
VsVim - Shortcut Key (快捷键)
查看>>
HDU5447 Good Numbers
查看>>
08.CXF发布WebService(Java项目)
查看>>
java-集合框架
查看>>
RTMP
查看>>
求一个数的整数次方
查看>>
点云PCL中小细节
查看>>
铁路信号基础
查看>>