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的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能将 QWebsocket::error SIGNAL 连接到 lambda 或具有相同签名的任何其他 SLOT 类型? QT5.9 [重复]