QVector<int>[index] 返回另一个 QVector?

Posted

技术标签:

【中文标题】QVector<int>[index] 返回另一个 QVector?【英文标题】:QVector<int>[index] returning another 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)。 【参考方案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)));

一些注意事项:

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

【讨论】:

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

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

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

【讨论】:

以上是关于QVector<int>[index] 返回另一个 QVector?的主要内容,如果未能解决你的问题,请参考以下文章

QVector<int> 写入/调整大小性能

无法访问复杂的 qvector 的方法

错误:“operator[]”不匹配(操作数类型为“QVector<int>”和“QCharRef”)

qvector倒序插入

QT迭代器 QVector<int>::iterator it;

qt5中QVector<double> 如何赋值