【发布时间】: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 是可变的?
标签: c++ qt lambda connect qobject