首页 > 解决方案 > 在 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 函数内部初始化。

标签: c++qt

解决方案


[&]必须小心使用Lambda 捕获。每当执行 lambda 时,所捕获内容的范围必须存在。

在您的代码中,绝对不是这种情况。当值发生变化时,您的 lambda 会被执行,这在 i 甚至不再存在之后很长很长。

在不测试其余部分的情况下,如果您将该捕获更改为[=](按值传递),它可能会起作用。

您可以[&]用于立即执行的事物,例如传递给 std::find_if 的函数。除非您引用一个您知道在调用 lambda 时仍然存在的值,否则您不能将它用于任何类似于回调的东西。基本上,如果调用被延迟,[&]可能是不安全的,你需要非常小心。


推荐阅读