c++ - 连接不拾取变量更改
问题描述
我正在尝试编写一个包含动画的应用程序。目前我想通过点击一个按钮来开始/停止动画。我的解决方案包括两个连接:
第一个连接注册单击按钮并更改布尔值
play
第二个连接将计时器链接到动画步骤,每 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 并单击按钮,我会收到单击的消息,但动画不会停止。)
解决方案
考虑在 lambda body 中,仅允许修改由 reference(&) 捕获的本地名称(变量)。& before play 意味着它应该作为参考存储,如果你不放 & before play 意味着它应该作为副本存储(隐式将通过 value 捕获)。默认情况下, lambda 的行为类似于 const 函数,因此当 lambda 声明为mutable时,lambda 主体不会修改捕获的变量,这意味着 lambda 不再是 const,您可以修改它们通过引用捕获的变量。
推荐阅读
- android - 使用 React Native 应用程序在哪里存储用于身份验证的用户密码
- java - Liquibase-向名称中包含指定后缀的所有表添加一列
- java - 在自定义数组列表中调用字符串数组
- java - Servlet 多次初始化
- python - 我收到一个错误“没有名为‘app.config’的模块;‘app’不是一个包”
- java - 当我从 Android Studio 中的选项卡式活动启动片段时,屏幕变黑
- google-drive-api - Google Drive API 显示错误的 storageQuota
- ssl - 为特定端口续订证书
- html - 如何防止表格中的单元格超出表格并具有固定宽度?
- office-js - 使用本机搜索框的 Outlook Web 插件