Qt C++ 将带有非空签名的信号连接到 lambda

Posted

技术标签:

【中文标题】Qt C++ 将带有非空签名的信号连接到 lambda【英文标题】:Qt C++ connect signal with non-void signature to lambda 【发布时间】:2014-10-24 09:40:20 【问题描述】:

我想将具有非 void 签名的信号连接到 lambda 函数。 我的代码如下所示

QTimeLine *a = new QTimeLine(DURATION, this); connect(a, &QTimeLine::valueChanged, [a,this](qreal r) mutable this->setMaximumHeight(r););

以类似于 SIGNAL-SLOT 方法的方式:

connect(a, SIGNAL(valueChanged(qreal),this,SLOT(doStuff(qreal)));

我的连接到 lambda 编译,但它不会改变 this->height()。 我做错了什么?我应该如何编写 lambda 以便它从 valueChanged 获取 qreal? 我阅读了相关文档,但找不到有用的示例。

****编辑****

事实上它有效,我弄错了 QTimeLine 设置。是的,我不需要捕获a。 我试图为 QTableWidget 的自定义 insertRow() 方法设置动画。 我还让 lambda 改变了表格行的高度,而不是包含的小部件的高度。作为参考,这里是工作的 sn-p:

QTimeLine *a = new QTimeLine(DURATION,this);
connect(a,&QTimeLine::valueChanged,[this](qreal r) mutable 
     this->list->setRowHeight(0,r * ROW::HEIGHT);
     );
a->start();

非常感谢您的快速回复。

【问题讨论】:

connect 返回什么?它向输出写入了哪些错误? 您能否提供一些我们可以编译的独立代码?我为自己写了一个,我无法重现这个问题,所以我假设我的代码不同...... 应该工作得很好。检查您的信号是否真的与 lambda 连接,以及 lambda 是否真的被调用。另外,我不明白为什么您的 lambda 需要捕获 a 此外,您的“旧变体”是否有效,即只是为了确保您正确使用 QTimeLine 以便发出信号。 为什么 lambda 是可变的? 【参考方案1】:

应该可以工作。这是一个完整的 SSCCE,它展示了它的工作原理。看看你在做什么,原则上有所不同。

main.cpp

#include <QTimeLine>
#include <QObject>
#include <QDebug>
#include <QCoreApplication>

class Foo

    void setMaximumHeight(int h) height = h; qDebug() << "Height:" << height;
    public:
    void doStuff()  QObject::connect(&timeLine, &QTimeLine::valueChanged, [this](qreal r) mutable  setMaximumHeight(r);); timeLine.start(); 
    int maximumHeight() const  return height; 
    int height0;
    int DURATION100;
    QTimeLine timeLineDURATION;
;

int main(int argc, char **argv)

    QCoreApplication application(argc, argv);
    Foo foo;
    foo.doStuff();
    return application.exec();

main.pro

TEMPLATE = app
TARGET = main
QT = core
CONFIG += c++11
SOURCES += main.cpp

构建并运行

qmake && make && ./main

【讨论】:

以上是关于Qt C++ 将带有非空签名的信号连接到 lambda的主要内容,如果未能解决你的问题,请参考以下文章

QT 信号和槽函数签名

QT:使用移动语义将信号连接到插槽

Qt:如何将不同类的静态信号连接到插槽?

将数组连接到 Qt 中的信号槽机制

Qt将信号连接到插槽

为啥我不能将 QWebsocket::error SIGNAL 连接到 lambda 或具有相同签名的任何其他 SLOT 类型? QT5.9 [重复]