• 2505阅读
  • 5回复

[提问]请问有没有办法用lambda表达式作为槽函数? [复制链接]

上一主题 下一主题
离线shishirong
 

只看楼主 倒序阅读 楼主  发表于: 2021-06-07

比如有一个函数是这样

  1. Device::Read(int addr,int lenth,const QObject* receiver, void (*callBack)())
  2. {
  3.     ...
  4.     connect(this,&this->ReadFinishSlot,receiver,callBack);
  5. }
现在想要实现用lambda表达式作为槽函数来调用,比如:

  1. Read(0,1,this,[=](){
  2. });

离线wanger233

只看该作者 1楼 发表于: 2021-06-07
   connect(btn2,&QPushButton::clicked,[=](){

    });
详细的里面参数怎么设置还是的去看参考资料
离线fsu0413

只看该作者 2楼 发表于: 2021-06-11
1楼已经说明了。
补充一点,最好不要使用3参数的lambda表达式connect,最好第三个参数加上一个关联对象,免得因为关联对象被delete导致程序崩溃。
离线20091001753

只看该作者 3楼 发表于: 2021-06-12
回 fsu0413 的帖子
fsu0413:1楼已经说明了。
补充一点,最好不要使用3参数的lambda表达式connect,最好第三个参数加上一个关联对象,免得因为关联对象被delete导致程序崩溃。 (2021-06-11 21:35) 

我记得,发射方 与 接收方,任何一方析构,关联都会自动断开,这是 QObject 自带的功能。
(づ ̄ 3 ̄)づ
离线fsu0413

只看该作者 4楼 发表于: 2021-06-12
回 20091001753 的帖子
20091001753:我记得,发射方 与 接收方,任何一方析构,关联都会自动断开,这是 QObject 自带的功能。 (2021-06-12 02:30) 

但是三参数的版本没有接收方。
离线wwwfffhhh

只看该作者 5楼 发表于: 2021-08-15
看看下面的方法是否满足你的要求?

tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::Any, 8888);

//设置响应TCP客户端连接请求的命令
connect(tcpServer, &QTcpServer::newConnection,
            [=]()//这里是一个Lamda表达式函数定义
            {
                OnProcessNewConnectEvent2();
            }
        );



void MainWindow::OnProcessNewConnectEvent2()
{
    if(tcpServer==nullptr)
        return;

    //取出建立好连接的套接字
    QTcpSocket* tcpSocket = tcpServer->nextPendingConnection();
    //获取对方的IP和端口
    QString ip = tcpSocket->peerAddress().toString();
    qint16 port = tcpSocket->peerPort();
    QString temp = QString("[%1:%2]:成功连接").arg(ip).arg(port);
    ui->textEditRead->setText(temp);

    //设置响应接收处理方法(这里也是采用Lamda表达式函数来写的)
    connect(tcpSocket, &QTcpSocket::readyRead,
            [=]()
            {
                //从通信套接字中取出内容
                QByteArray array = tcpSocket->readAll();
                ui->textEditRead->append(array);

//给对方发送数据
                QString str = "abcd";
                tcpSocket->write(str.toUtf8().data());
            }
    );

    //设置响应远方断开处理方法(这里也是采用Lamda表达式函数来写的)    
    connect(tcpSocket, &QTcpSocket::disconnected,
            [=]()
            {
                //经过测试这里的tcpSocket虽然在调试的时候QT提示是无效指针,但实际确实是等于原来有效的tcpSocket指针值
            }
    );
}

快速回复
限100 字节
 
上一个 下一个