Qt中emit与return的异同对比及emit功能作用相关技术咨询
Qt
emit 关键字功能、运行机制及与return的对比 emit的核心功能
emit是Qt元对象系统为信号槽机制提供的语法标记,属于Qt对C的扩展,本身不是C标准关键字。实际预处理阶段会被Qt的moc(元对象编译器)替换为空,本质上只是个方便开发者识别信号触发逻辑的标识,你完全可以省略emit直接调用信号函数,运行效果没有任何区别。
emit的运行机制
当执行emit 信号名(参数)逻辑时:
- 默认同步连接(Qt::AutoConnection/Qt::DirectConnection)场景下:会直接按绑定顺序依次调用所有和该信号关联的槽函数,等所有槽函数全部执行完成后,才会继续运行
emit语句之后的代码。 - 异步队列连接(Qt::QueuedConnection)场景下:会把信号调用封装成事件投递到接收对象所属线程的事件循环队列,直接返回继续执行后续代码,不会等待槽函数执行。
和return的差异对比
两者从设计定位到运行逻辑完全没有相似性,核心区别如下:
- 定位不同:
return是C++原生标准关键字,作用是终止当前函数的执行,将返回值传递给函数调用方;emit只是信号触发的语法标记,不会终止当前函数的运行。 - 执行逻辑不同:可以参考以下示例代码直观理解:
void DemoClass::testFunc() { qDebug() << "emit执行前"; // 假设testSignal已绑定3个槽函数,每个槽打印一行对应日志 emit testSignal(); qDebug() << "emit执行后"; return; // 以下代码在return之后,永远不会被执行 qDebug() << "return执行后"; }
默认同步连接场景下的输出顺序为:
emit执行前
槽函数1输出
槽函数2输出
槽函数3输出
emit执行后
如果是异步连接场景,槽函数的输出会出现在emit执行后之后,但不管是哪种连接模式,return后的代码都永远不会执行。
内容的提问来源于stack exchange,提问作者Swati Sarangi
相关产品推荐
相关产品推荐

