gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:03:12 26 4
gpt4 key购买 nike

我想将具有非 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 以便它从 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();

非常感谢您的快速回复。

最佳答案

应该可以正常工作。这是一个完整的 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();
}

主程序

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

构建并运行

qmake && make && ./main

关于c++ - Qt C++ 将具有非空签名的信号连接到 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26545396/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com