c++ - 在 QT 中使用生成的旋转框编辑矢量
问题描述
我正在尝试使用类生成的 qdoublespinboxes 修改双精度向量。我尝试了许多不同的解决方案,但我无法弄清楚如何在 connect lambda 函数中获取变量“i”。这是我第一次在 QT 中动态创建 ui 元素,所以我的方法可能非常偏离。
矢量编辑器.h
#ifndef VECTOR_EDITOR_H
#define VECTOR_EDITOR_H
#include <QGridLayout>
#include <QWidget>
#include <QDoubleSpinBox>
#include <vector>
using namespace std;
class vector_editor
{
public:
vector_editor(QWidget* widget, vector<double>& v);
QGridLayout* grid;
};
#endif // VECTOR_EDITOR_H
矢量编辑器.cpp
#include "vector_editor.h"
vector_editor::vector_editor(QWidget* widget, vector<double>& v)
{
grid = new QGridLayout(widget);
for(uint i=0;i<v.size();i++){
QDoubleSpinBox* spinbox = new QDoubleSpinBox(widget);
spinbox->setValue(v[i]);
grid->addWidget(spinbox,i,0);
QObject::connect(spinbox, QOverload<double>::of(&QDoubleSpinBox::valueChanged), [&](double d){
v[i] = d;
});
}
}
主窗口.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "vector_editor.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
vector<double> v = vector<double>{1,2,3};
vector_editor(ui->widget,v);
}
MainWindow::~MainWindow()
{
delete ui;
}
每当我尝试更改一个旋转框的值时,程序就会崩溃,因为“i”变量尚未在 lambda 函数内部初始化。
解决方案
[&]
必须小心使用Lambda 捕获。每当执行 lambda 时,所捕获内容的范围必须存在。
在您的代码中,绝对不是这种情况。当值发生变化时,您的 lambda 会被执行,这在 i 甚至不再存在之后很长很长。
在不测试其余部分的情况下,如果您将该捕获更改为[=]
(按值传递),它可能会起作用。
您可以[&]
用于立即执行的事物,例如传递给 std::find_if 的函数。除非您引用一个您知道在调用 lambda 时仍然存在的值,否则您不能将它用于任何类似于回调的东西。基本上,如果调用被延迟,[&]
可能是不安全的,你需要非常小心。
推荐阅读
- rust - 处理拒绝时获取当前路径
- javascript - 如何在 JavaScript 的控制台中输入水平线?
- python - 如何使用 kivy v2.0.0 播放视频?
- swiftui - 如何为 SwiftUI ViewRepresentable 制作自定义 MKMapView 委托操作?
- python - Python - 将函数应用于二维数组
- python - 循环格式化请求有效负载
- stripe-payments - 如何使用 Stripe Connect Express 创建发票,在 Stripe Subscriptions 上自动创建发票,但不是在 Stripe Connect 付款上
- xquery - xquery中特定日期格式之间的日期比较
- python - 根据 Python Pandas 中 DataFrame 中的值求和?
- php - 未定义变量:工厂 Laravel 8 Livewire