首页 > 解决方案 > 连接不拾取变量更改

问题描述

我正在尝试编写一个包含动画的应用程序。目前我想通过点击一个按钮来开始/停止动画。我的解决方案包括两个连接:

  1. 第一个连接注册单击按钮并更改布尔值play

  2. 第二个连接将计时器链接到动画步骤,每 200 毫秒调用一次步骤函数并更新场景

这是一段代码:

bool play = false;

connect(button1, &QPushButton::clicked, this, [play]() mutable
    {
        qDebug() << "clicked!";
        play = !play;
        qDebug() << play;
    }
    );

connect(_timer, &QTimer::timeout, scene, [this, play, scene]()
    {
        if (play) {
            qDebug() << "play is true";
            step(mat);
            updateScene(mat, scene);
        }
    }
    );

从某种意义上说,两个连接似乎都在起作用,如果我单击按钮,我会收到“单击”消息,然后是消息 True/False 与每次单击交换。如果我初始化play为 true,场景会每 200 毫秒更新一次,但是当play为 false 并且我单击按钮时,第二次连接似乎没有接收到变量的变化并且动画不播放。(类似地,如果我将 `play 设置为 true 并单击按钮,我会收到单击的消息,但动画不会停止。)

标签: c++qt

解决方案


考虑在 lambda body 中,仅允许修改由 reference(&) 捕获的本地名称(变量)。& before play 意味着它应该作为参考存储,如果你不放 & before play 意味着它应该作为副本存储(隐式将通过 value 捕获)。默认情况下, lambda 的行为类似于 const 函数,因此当 lambda 声明为mutable时,lambda 主体不会修改捕获的变量,这意味着 lambda 不再是 const,您可以修改它们通过引用捕获的变量。


推荐阅读