当前位置: 首页 > news >正文

QT中connect高级链接——指针、lambda、宏

1、connect使用指针
connect(button,&QPushButton::released,this,&MainWidget::mySlot);  //【抬起】按钮button时,修改按钮b2的标题 

2、使用lambda表达式

引入lambda表达式,类似内联函数,可以用于不会被重用的短代码片段,不需要名称,不需要声明。当在 Qt 中配合信号一起使用时,lambda表达式的好处是不用定义槽函数

,也不用指定信号接收者,对于非被重复调用的槽函数起到精简代码的作用。

定义

[ capture list
 ] (parameters) -> return-type  
{   function body
} 

capture list说明

CaptureDescription
[]No capture; Lambda doesn't access any variables from the surrounding scope.
[var]Capture 'var' by value; Lambda has a copy of 'var' and can use it.
[&var]Capture 'var' by reference; Lambda refers to the original 'var'.
[=]Capture all local variables by value; Lambda has copies of all local variables.
[&]Capture all local variables by reference; Lambda refers to all local variables.
[this]Capture the 'this' pointer; Lambda can access the members of the current object.
[var, &other]Mix of capture modes; 'var' is captured by value, 'other' is captured by reference.
[=, &var]Mix of capture modes; 'var' is captured by reference, other variables are captured by value.

QT中槽函数

connect(&iperf_pro, &QProcess::readyReadStandardOutput, [&]() {QByteArray newData = iperf_pro.readAllStandardOutput();QString currentText = pnetperf_area->toPlainText();currentText += QString::fromLocal8Bit(newData);pnetperf_area->setPlainText(currentText);//pnetperf_area->append(QString(newData));});

lambda表达式开销

由于lambda将生成一个类,因此它的开销将与创建一个包含与捕获的变量数量相同的等效类一样。捕获的变量越多(特别是按值),生成的函数类就越大,使用lambda的成本也就越高。如果通过引用捕获,开销就是几个对应指针的大小。

如果没有捕获任何变量,则它实际上是一个函数调用。如果捕获一个变量,其代价与构造一个对象并直接在其上调用函数相同,而不需要进行虚拟查找。lambda的代价永远不会大于等效函数/类的代价。

connect(button,&QPushButton::released,  [button]()   
    // 在此处添加mutable关键字,代表传进来的变量可以被修改,不写该关键字则不能被修改  
   {  
        if(button->text()=="Lambda表达式") button->setText("表达式Lambda"); //修改按钮标题  
        else button->setText("Lambda表达式");                          //修改按钮标题  

        qDebug()<<"111111111"; //输出"111111111"  
        // qDebug()<<a<<b; //当方括号内包含变量a、b或为等号时,此处可以输出变量a、b的值  
    }  
    );  
// []代表把外部变量传进来,如果不传是不能被使用的  
// [button]代表把变量button传进来
// [=]代表把外部所有局部变量、类中所有成员以值的传递方式  
// [this]代表把类中所有成员以值的传递方式  
// [&]代表把外部所有局部变量引用,引用符号  
// int a=10,b=100;  
// ()第二个参数 函数的参数列表  

3、使用宏
connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));
//由于使用宏并不会做错误检查,所以不建议使用

相关文章:

  • Linux云计算训练营笔记day03(Rocky Linux中的命令)
  • MySQL OCP 认证限时免费活动​ 7 月 31 日 前截止!!!
  • Linux中的线程安全与线程同步详解
  • WordPress个人博客搭建(三):WordPress网站优化
  • vue3:十二、图形看板- 基础准备+首行列表项展示
  • 用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本1(Client端)
  • 国产数据库铸就数字基建新基石,助力农业产业转型升级
  • yolov8n-obb训练rknn模型
  • 矩阵系统源码搭建 UI 设计开发指南,支持OEM
  • 多账号管理、反追踪与自动化测试:我的浏览器实战笔记
  • 1992-2023年全国及31省对外开放度测算数据(含原始数据+计算过程+结果)(无缺失)
  • springboot集成langchain4j记忆对话
  • JavaSE核心知识点01基础语法01-05(字符串)
  • 【信息系统项目管理师】【2017年-2024年】58个案例概念题
  • CODESYS开发环境下的快捷键和软件操作汇总
  • 使用Java NIO 实现一个socket通信框架
  • LangChain第二讲:不设置环境变量也能调用LLM大模型吗?(更简单地调用LLM)
  • 【C++】【数据结构】【API列表】标准库数据结构
  • DDPM(Denoising Diffusion Probabilistic Models,去噪扩散概率模型)
  • ✍️【TS类型体操进阶】挑战类型极限,成为类型魔法师!♂️✨
  • 迪拜金融市场CEO:2024年市场表现出色,超八成新投资者来自海外
  • 马上评|比余华与史铁生的友情更动人的是什么
  • 金融监管总局:近五年民企贷款投放年平均增速比各项贷款平均增速高出1.1个百分点
  • 以军总参谋长:已进入“决定性打击计划的第二阶段”
  • 夜读丨母亲的手擀面
  • 外交部:印巴都表示不希望局势升级,望双方都能保持冷静克制