QVector [指数]还有另一个QVector?

问题描述 投票:0回答:2

我对C ++编程很陌生,所以我可能只是遗漏了一些东西,但我一直试图弄清楚这一近一个小时了。

我在我的QLabels有一套UI,我希望每秒更新两次。它更新的数据存储在大小为12的QVector<int>中。

MainWindow::MainWindow(QWidget *parent) :
    [...]
    knobCoords(new QVector<int>(12)),
    updateTimer(new QTimer(this))
{
    connect(updateTimer, SIGNAL(timeout()), this, SLOT(updateCoordLabels()));
    updateTimer->start(500);
}

为了更新标签,我需要将int值转换为字符串。这是直接在updateCoordLabels()函数中完成的:

void MainWindow::updateCoordLabels() {
    tracker->updateCoordData(*knobCoords);
    ui->knobA_xCoordsLabel->setText(to_string(knobCoords[0]));
    ui->knobA_yCoordsLabel->setText(to_string(knobCoords[1]));
    ui->knobA_zCoordsLabel->setText(to_string(knobCoords[2]));
    ui->knobB_xCoordsLabel->setText(to_string(knobCoords[3]));
    [...]
    updateTimer->start(500);
}

但是,当我编译程序时,我得到一个类型不匹配。由于某种原因,knobCoords[index]没有像预期的那样返回int,而是QVector<int>

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>)'

我究竟做错了什么?

c++ qt qvector
2个回答
1
投票

knobCoords是一个QVector<int>*意味着你必须在使用下标运算符之前尊重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)));

一些警示说明:

  1. 不要不必要地使用指针。除了你刚刚看到它们引入的混乱之外,如果在对象析构函数中没有正确处理它们会导致内存泄漏。一个更重要的问题是错误恢复发挥作用
  2. 将您的业务逻辑与前端分开。向前迈出的一个好步骤是永远不要在内部使用Qt容器。 Qt在使用标准容器方面做得很好,所以不是QVector<int>更喜欢vector<int>或者如果你使用的是修正尺寸:array<int, 12>
  3. Although it doesn't make any difference for QVector标准容器,你要避免使用at函数更喜欢下标运算符,因为at即使在发布时也会产生边界检查费用

0
投票

为了防止这种和类似的问题,尽可能摆脱指针,在堆栈上分配变量。

这是C ++,not Java。你必然会以这种方式获得大量内存泄漏,因为没有垃圾收集器。并且它可以帮助您免受上述许多麻烦。

© www.soinside.com 2019 - 2024. All rights reserved.