【问题标题】:Qt C++ connect signal with non-void signature to lambdaQt C++ 将带有非空签名的信号连接到 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 是可变的?

标签: c++ qt lambda connect qobject


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-03-15
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多