QT新手求助:如何从数组自动填充QScatterDataArray?
从数组自动生成QScatterDataArray的解决方案
嘿,刚接触Qt 3D绘图对吧?手动一个个写QVector3D确实太麻烦了,用循环批量处理就轻松多了!我给你改一下代码,顺便解释清楚每一步怎么回事。
核心思路
- 先把你的坐标数据整理成一个二维数组(或者结构体数组,看你习惯),方便循环遍历
- 用
for循环逐个读取数组里的x、y、z值,转换成QVector3D后添加到QScatterDataArray中 - 最后把填充好的数据传给series就行
修改后的完整代码
// 假设你的graph已经初始化完成 QScatter3DSeries *series = new QScatter3DSeries(graph); QScatterDataArray data; // 第一步:把坐标数据存成二维数组,每一行对应一组(x,y,z) // 注意:C++里0开头的数字会被解析为八进制!比如原来的02实际是十进制2,014是十进制12,这里改成十进制写法避免歧义 float coords[15][3] = { {50, 10, 0}, {5, 8, 9}, {0, 10, 15}, {30, 50, 2}, {15, 83, 7}, {4, 20, 45}, {40, 14, 10}, {35, 28, 21}, {4, 0, 15}, {70, 10, 27}, {15, 28, 47}, {62, 70, 45}, {50, 10, 0}, {5, 8, 17}, {31, 20, 35} }; // 第二步:循环遍历数组,批量生成QVector3D并添加到data中 int itemCount = sizeof(coords) / sizeof(coords[0]); // 计算数组元素总数 for (int i = 0; i < itemCount; ++i) { float x = coords[i][0]; float y = coords[i][1]; float z = coords[i][2]; data << QVector3D(x, y, z); // 也可以用 data.append(QScatterDataItem(QVector3D(x,y,z))); 效果完全一致 } // 后续步骤和你原来的代码保持一致 series->dataProxy()->addItems(data); graph->addSeries(series);
几个新手容易踩的小坑
- 八进制数字陷阱:你原来代码里的
02、014这类以0开头的数字,C++会默认当成八进制解析,结果和你预期的十进制数可能不一样,我已经在数组里帮你修正了,以后写数字记得避开这个问题。 - 数组长度计算:
sizeof(coords)/sizeof(coords[0])是C++里计算静态数组元素个数的常用方法,如果以后用动态数组(比如std::vector),直接用.size()就能获取长度。 - QScatterDataArray本质:它其实是
QVector<QScatterDataItem>的别名,所以用<<或者append()添加元素都可以,选你觉得顺手的写法就行。
这样以后你只要更新coords数组里的数据,循环会自动处理所有元素,不用再手动重复写QVector3D啦~
内容的提问来源于stack exchange,提问作者ino
相关产品推荐
相关产品推荐

