QVector<;int>;[索引]返回另一个QVector? 我对C++编程有点新,所以我可能只是缺少了一些东西,但是我已经试着把它弄明白了将近一个小时。

QVector<;int>;[索引]返回另一个QVector? 我对C++编程有点新,所以我可能只是缺少了一些东西,但是我已经试着把它弄明白了将近一个小时。,c++,qt,qvector,C++,Qt,Qvector,我的UI中有一组qlabel,我想每秒更新两次。更新后的数据存储在大小为12的QVector中 MainWindow::MainWindow(QWidget *parent) : [...] knobCoords(new QVector<int>(12)), updateTimer(new QTimer(this)) { connect(updateTimer, SIGNAL(timeout()), this, SLOT(updateCoordLabe

我的
UI
中有一组
qlabel
,我想每秒更新两次。更新后的数据存储在大小为12的
QVector

MainWindow::MainWindow(QWidget *parent) :
    [...]
    knobCoords(new QVector<int>(12)),
    updateTimer(new QTimer(this))
{
    connect(updateTimer, SIGNAL(timeout()), this, SLOT(updateCoordLabels()));
    updateTimer->start(500);
}
然而,当我编译程序时,我得到一个类型不匹配。由于某些原因,
knobCoords[index]
不会像预期的那样返回
int
,而是返回
QVector

mainwindow.cpp:124: error: C2665: 'std::to_string': none of the 9 overloads could convert all the argument types
[...]
mainwindow.cpp:124: while trying to match the argument list '(QVector<int>)'
mainwindow.cpp:124:错误:C2665:'std::to_string':9个重载都无法转换所有参数类型
[...]
mainwindow.cpp:124:尝试匹配参数列表“(QVector)”时

我做错了什么?

knobCoords
是一个
QVector*
,这意味着在对其使用下标运算符之前必须遵守
knobCoords

你可以改为:

ui->knobA_xCoordsLabel->setText(to_string(knobCoords->at(0)));
ui->knobA_yCoordsLabel->setText(to_string(knobCoords->at(1)));
ui->knobA_zCoordsLabel->setText(to_string(knobCoords->at(2)));
ui->knobB_xCoordsLabel->setText(to_string(knobCoords->at(3)));

一些注意事项:

  • 不要不必要地使用指针。除了您刚才看到的混淆之外,如果在对象析构函数中没有正确处理它们,它们将导致内存泄漏。当错误恢复开始发挥作用时,一个更重要的问题出现了
  • 将业务逻辑与前端分开。实现这一目标的一个好步骤是永远不要在内部使用Qt容器。Qt在处理标准容器方面做得很好,因此与其使用
    QVector
    不如使用
    vector
    或者使用固定大小的数组:
    array
  • 对于标准容器,您希望避免使用
    at
    函数,将下标运算符首选为
    at
    会导致边界检查费用,即使在发布时也是如此

  • 为了防止这种情况和类似的问题,尽可能去掉指针,在堆栈上分配变量


    这是C++,。这样肯定会导致大量内存泄漏,因为没有垃圾收集器。这将使你免于上述许多麻烦。

    所有这些
    new
    的吓唬我
    knobCoords(new QVector(12))
    表明
    knobCoords
    是一个
    QVector*
    (指针,而不是“普通的”
    QVector
    )似乎
    knobCoords
    是一个指针。您需要先取消对它的引用。我认为您的错误与
    int
    无关,而是与
    std::string
    有关。
    std::to_string
    错误意味着您必须存储
    ui->knobA\u xCoordsLabel
    的文本,其余文本使用
    QString
    ,而不是
    std::string
    。试着用谢谢你们,我现在解决了。我切换了它,这样knobCoords就不再是指针了,并且使用了QString::number()而不是to_字符串(就像QLabel使用QString一样)。边界检查可能是一个优势,特别是对于初学者。我建议使用它,除非代码中存在真正的瓶颈。@Murphy对每个人都有自己的瓶颈,我只是想强调一下,虽然Qt容器与标准容器没有区别。
    ui->knobA_xCoordsLabel->setText(to_string(knobCoords->at(0)));
    ui->knobA_yCoordsLabel->setText(to_string(knobCoords->at(1)));
    ui->knobA_zCoordsLabel->setText(to_string(knobCoords->at(2)));
    ui->knobB_xCoordsLabel->setText(to_string(knobCoords->at(3)));