QT之connect的第五个参数(信号与槽的使用)

更新时间:2023-06-30 10:36:18 阅读: 评论:0

QT之connect的第五个参数(信号与槽的使⽤)
⼀、QT connect 第5个参数⼀般不填,为默认值。
1、Qt::AutoConnection: 默认值,使⽤这个值则连接类型会在信号发送时决定。如果接收者和发送者在同⼀个线程,则⾃动使⽤
birthdate
Qt::DirectConnection类型。如果接收者和发送者不在⼀个线程,则⾃动使⽤Qt::QueuedConnection类型。
2、Qt::DirectConnection:槽函数会在信号发送的时候直接被调⽤,槽函数和信号发送者在同⼀线程。效果看上去就像是直接在信号发送位置调⽤了槽函数,效果上看起来像函数调⽤,同步执⾏。
emit语句后⾯的代码将在与信号关联的所有槽函数执⾏完毕后才被执⾏。
⽆论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执⾏。
在线英汉互译
3、Qt::QueuedConnection:信号发出后,信号会暂时被放到⼀个消息队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,然后执⾏和信号关联的槽函数,这种⽅式既可以在同⼀线程内传递消息也可以跨线程操作。
emit语句后的代码将在发出信号后⽴即被执⾏,⽆需等待槽函数执⾏完毕
槽函数在接收者所依附线程执⾏。
4、Qt::BlockingQueuedConnection:槽函数的调⽤时机与Qt::QueuedConnection⼀致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运⾏完。⽽且接收者和发送者绝对不能在⼀个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。
thatisall5、Qt::UniqueConnection:这个flag可以通过按位或(|)与以上四个结合在⼀起使⽤。当这个flag设置时,当某个信号和槽已经连接时,再进⾏重复的连接就会失败。也就是为了避免重复连接。
⼀般qt connect的第五个参数会在多线程中运⽤到,需要注意的是:
QThread是⽤来管理线程的,QThread对象所依附的线程和所管理的线程并不是同⼀个概念。QThread所依附的线程,就是创建QThread 对象的线程;QThread 所管理的线程,就是run启动的线程,也就是新建线程。
例如:QThread对象依附在主线程中,QThread对象的slot函数会在主线程中执⾏,⽽不是次线程。除⾮QThread对象依附到次线程中(通过movetoThread)。
或许你可能会感兴趣:
⼆、信号
声明信号使⽤signals关键字,发送信号使⽤emit关键字。
注意点:
1.所有的信号声明都是公有的,所以Qt规定不能在signals前⾯加public,private, protected。
2.所有的信号都没有返回值,所以返回值都⽤void。
3.所有的信号都不需要定义。
4.必须直接或间接继承⾃QOBject类,并且开头私有声明包含Q_OBJECT。
5.在同⼀个线程中,当⼀个信号被emit发出时,会⽴即执⾏其槽函数,等槽函数执⾏完毕后,才会执⾏emit后⾯的代码,如果⼀个信号链接了多个槽,那么会等所有的槽函数执⾏完毕后才执⾏后⾯的代码,槽函数的执⾏顺序是按照它们链接时的顺序执⾏的。不同线程中(即跨线程时),槽函数的执⾏顺序是随机的。无忧雅思口语预测
6.在链接信号和槽时,可以设置链接⽅式为:在发出信号后,不需要等待槽函数执⾏完,⽽是直接执⾏后⾯的代码,是通过connect的第5个参数。
voltdb7.信号与槽机制要求信号和槽的参数⼀致,所谓⼀致,是参数类型⼀致。如果不⼀致,允许的情况是,信号的参数可以⽐槽函数的参数多,即便如此,槽函数存在的那些参数的顺序也必须和信号的前⾯⼏个⼀致起来。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数⽐信号的少),但是不能说信号根本没有这个数据,你就要在槽函数中使⽤(就是槽函数的参数⽐信号的多,这是不允许的)。
三、connect函数原型
a.如:connect(pushButton, SIGNAL(clicked()), dialog, SLOT(clo()));Qt4和Qt5都可以使⽤这种连接⽅式。
static QMetaObject::Connection connect(
const QObject *nder,    //信号发送对象指针
const char *signal,      //信号函数字符串,使⽤SIGNAL()
const QObject *receiver,  //槽函数对象指针
const char *member,      //槽函数字符串,使⽤SLOT()
Qt::ConnectionType = Qt::AutoConnection);
b.如:connect(pushButton, &QPushButton::clicked, dialog, &QDialog::clo);这是Qt5新增的连接⽅式,这使得在编译期间就可以进⾏拼写检查,参数检查,类型检查,并且⽀持相容参数的兼容性转换。
static QMetaObject::Connection connect(
const QObject *nder,      //信号发送对象指针
const QMetaMethod &signal,  //信号函数地址
const QObject *receiver,    //槽函数对象指针
const QMetaMethod &method,  //槽函数地址
Qt::ConnectionType type = Qt::AutoConnection);
四、信号与槽的多种⽤法
hayabusa1、⼀个信号可以和多个槽相连;
2、多个信号可以连接到⼀个槽;
3、⼀个信号可以连接到另外的⼀个信号;
4、槽可以被取消链接.
其写法和connect⼀样,只需要将connect换成disconnect即可。
coding
五、槽的属性
public slots:在这个区内声明的槽意味着所有对象都可将信号和之相连接。这对于组件编程⾮常有⽤,你能创建彼此互不了解的对象,将他们的信号和槽进⾏连接以便信息能够正确的传递。
rver是什么意思protected slots:在这个区内声明的槽意味着当前类及其⼦类能将信号和之相连接。
private slots:在这个区内声明的槽意味着只有类⾃⼰能将信号和之相连接。
注:信号和槽不能携带模板类参数.
补充:
Qt提供了⼀种机制,能够⾃动、有效的组织和管理继承⾃QObject的Qt对象,这种机制就是对象树.
稍等一下
only是什么意思优点:能够帮助程序员缓解内存泄露的问题,提⾼编程效率,同时也保证了系统的稳健性.
举例:当应⽤程序创建了⼀个具有⽗窗⼝部件的对象时,该对象将被加⼊⽗窗⼝部件的孩⼦列表。当应⽤程序销毁⽗窗⼝部件时,其下的孩⼦列表中的对象将被⼀⼀删除.这就是为什么我们创建出⼀个对象时,都最好在初始化的时候加上this指针.new了⼀个⽗窗⼝后,只要delete⽗窗⼝后,那它的⼦窗⼝都会被⾃动释放,释放顺序(即析构顺序)与这些⼦对象的构造顺序相反.

本文发布于:2023-06-30 10:36:18,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/1070033.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:信号   函数   线程   对象   参数   发送   需要
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图