我想将带有非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)));
我的connect-to-lambda编译,但它不会改变this->height()
。
我弄错了什么?我应该如何编写lambda以便从qreal
获取valueChanged
?
我阅读了相关文档,但我找不到有用的例子。
**** **** EDIT
实际上它有效,我的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();
非常感谢你们快速回复。
答案 0 :(得分:1)
应该工作。这是一个完整的SSCCE,演示它的工作原理。检查你在原则上做了哪些不同。
#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();
}
TEMPLATE = app
TARGET = main
QT = core
CONFIG += c++11
SOURCES += main.cpp
qmake && make && ./main