qt之connect函数--信号槽连接的几种方式和优缺点

connect函数在QT中作为连接信号和槽的函数,有以下三种写法:

1.使用SIGNAL和SLOT宏(宏函数将信号和槽函数转换为const char *类型的字符串)

connect(ui->pushbutton,SIGNAL(clicked),this,SLOT(onPushButtonClicked()))

2.使用&类名::函数名

connect(ui->pushbutton,&QPushButton::clicked,this,onSetBlockedSignalStatus)

优点:

        1.不需要写参数更简便

        2.不需要槽函数的参数类型与信号对应的参数类型完全一致,只需要进行隐藏式转换

        3.可以在编译时进行检查,比如信号或者槽函数的拼写错误、槽函数参数数量多于信号的参数数量等都能在编译时期发现,而不是运行时。

3.Lambda表达式,关联后直接编写信号发射后要执行的代码,不需要定义槽函数

Qt框架中,信号(Signal)和Slot)是用于处理事件和数据传递的关键机制。它们之间的连接有以下几种常见的方式: 1. **直接连接**(Direct Connection): - 使用`QObject::connect()`函数,可以直接将一个信号连接到另一个上。例如: ```cpp QObject *sender = new SomeObject; QObject *receiver = new AnotherObject; connect(sender, &SomeObject::signalName, receiver, &AnotherObject::slotName); ``` 这种连接在发送者对象被销毁时不会自动断开。 2. **自动连接**(Queued Connections): - `Qt::QueuedConnection`参数表示信号会在事件循环中的下一个空闲时刻执行。这可以防止UI线程被阻塞,提高响应速度。如: ```cpp connect(sender, &SomeObject::signalName, receiver, &AnotherObject::slotName, Qt::QueuedConnection); ``` 3. **延迟连接**(One-Shot Connections): - 使用`Qt::UniqueConnection`,一旦信号被触发,就会断开连接。这对于一次性操作很有用,避免回调地狱。示例: ```cpp connect(sender, &SomeObject::signalName, receiver, &AnotherObject::slotName, Qt::UniqueConnection); ``` 4. **信号安全连接**(SLOT()宏): - 如果你想确保信号总是正确地连接到某个,可以使用`QMetaObject::connection()`配合`SLOT()`宏。这种方式在编译阶段检查连接是否有效。示例: ```cpp connect(sender, SIGNAL(signalName()), SLOT(slotName())); ``` 5. **信号/信号连接**(Signal-to-Signal): - 对于一些复杂逻辑,可能需要一个信号触发另一个信号。`QSignalMapper`就是为此设计的工具,它将一个信号映射到一组可能的目标信号。 6. **动态连接**(Dynamic Binding): - 使用`QObject::disconnect()`可以在运行时动态地断开已经建立的连接。 了解这些连接方式后,你可以根据具体需求选择最合适的连接策略,提升代码的灵活性和性能。如果你打算使用特定的方式,请确保对信号的生命周期管理得当,尤其是涉及到跨生命周期的连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值