Qt C++连接非void签名的信号到lambda函数

3
我想将一个带有非空签名的信号连接到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更改表行的高度,而不是包含小部件的高度。供参考,以下是有效的片段:
QTimeLine *a = new QTimeLine(DURATION,this);
connect(a,&QTimeLine::valueChanged,[this](qreal r) mutable {
     this->list->setRowHeight(0,r * ROW::HEIGHT);
     });
a->start();

非常感谢您的及时回复。


connect 返回什么?它会将哪些错误写入输出? - Ezee
请提供一些自包含的代码,以便我们可以编译。我为自己写了一个,但我无法重现这个问题,所以我认为我的代码可能不同... - László Papp
1
它应该完美地运行。检查一下你的信号是否真的连接到了 lambda,以及 lambda 是否真的得到了调用。此外,我不明白为什么你的 lambda 需要捕获 a - SingerOfTheFall
1
此外,您的“旧版本”是否有效,即确保您正确使用QTimeLine以便信号被发射。 - László Papp
2
为什么lambda是可变的? - MSalters
1个回答

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 height{0};
    int DURATION{100};
    QTimeLine timeLine{DURATION};
};

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接