【问题标题】:QVector<int>[index] returning another QVector?QVector<int>[index] 返回另一个 QVector?
【发布时间】:2017-12-22 13:47:12
【问题描述】:

我是 C++ 编程的新手,所以我可能只是遗漏了一些东西,但我已经尝试了将近一个小时。

我的UI 中有一组QLabels,我想大约每秒更新两次。它所更新的数据存储在大小为 12 的 QVector&lt;int&gt; 中。

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&lt;int&gt;

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

我做错了什么?

【问题讨论】:

  • 这些new吓到我了
  • knobCoords(new QVector&lt;int&gt;(12)) 建议 knobCoordsQVector*(指针,而不是“普通”QVector
  • 看来knobCoords是一个指针。您需要先取消引用它。
  • 我认为您的错误与int 无关,而是std::stringstd::to_string 错误意味着您必须使用 QString 而不是 std::string 来存储 ui-&gt;knobA_xCoordsLabel 的文本和其余部分。尝试使用QString::number
  • 谢谢各位,我现在解决了。我切换了它,所以 kubCoords 不再是指针并使用 QString::number() 而不是 to_string (因为 QLabel 无论如何都需要 QString)。

标签: c++ qt qvector


【解决方案1】:

knobCoordsQVector&lt;int&gt;*,这意味着在使用下标运算符之前,您必须遵循 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&lt;int&gt; 更喜欢 vector&lt;int&gt; 或者如果您使用的是修复大小:array&lt;int, 12&gt;
  3. Although it doesn't make any difference for QVector 对于标准容器,您需要避免使用at 函数,因为at 会在发布时产生边界检查费用

【讨论】:

  • 边界检查可能是一个优势,尤其是对于初学者。我建议使用它,除非该代码存在真正的瓶颈。
  • @Murphy 对于每个人来说,我只是想强调一点,虽然 Qt 容器没有区别,但标准容器却没有区别。
【解决方案2】:

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

这是 C++,not Java。由于没有垃圾收集器,因此您肯定会以这种方式获得大量内存泄漏。而且它会让你免于像上面这样的许多头痛。

【讨论】:

    猜你喜欢
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多