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<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>)'
我做错了什么?
【问题讨论】:
这些new
吓到我了
knobCoords(new QVector<int>(12))
建议 knobCoords
是 QVector*
(指针,而不是“普通”QVector
)
看来knobCoords
是一个指针。您需要先取消引用它。
我认为您的错误与int
无关,而是std::string
。 std::to_string
错误意味着您必须使用 QString
而不是 std::string
来存储 ui->knobA_xCoordsLabel
的文本和其余部分。尝试使用QString::number
谢谢各位,我现在解决了。我切换了它,所以 kubCoords 不再是指针并使用 QString::number() 而不是 to_string (因为 QLabel 无论如何都需要 QString)。
【参考方案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)));
一些注意事项:
-
不要不必要地使用指针。除了您刚刚看到它们引入的混乱之外,如果它们在对象析构函数中没有正确处理,它们会导致内存泄漏。一个更重要的问题是错误恢复开始发挥作用
将业务逻辑与前端分离。朝着这个方向迈出的一个好步骤是永远不要在内部使用 Qt 容器。 Qt 在使用标准容器方面做得很好,所以而不是
QVector<int>
更喜欢 vector<int>
或者如果您使用的是修复大小:array<int, 12>
Although it doesn't make any difference for QVector
对于标准容器,您需要避免使用at
函数,因为at
会在发布时产生边界检查费用
【讨论】:
边界检查可能是一个优势,尤其是对于初学者。我建议使用它,除非该代码存在真正的瓶颈。 @Murphy 对于每个人来说,我只是想强调一点,虽然 Qt 容器没有区别,但标准容器却没有区别。【参考方案2】:为了防止这个和类似的问题,尽可能摆脱指针,在堆栈上分配变量。
这是 C++,not Java。由于没有垃圾收集器,因此您肯定会以这种方式获得大量内存泄漏。而且它会让你免于像上面这样的许多头痛。
【讨论】:
以上是关于QVector<int>[index] 返回另一个 QVector?的主要内容,如果未能解决你的问题,请参考以下文章
错误:“operator[]”不匹配(操作数类型为“QVector<int>”和“QCharRef”)