use*_*980 1 c++ opengl qt mingw
我正在尝试编译旧的 Qt 项目,但遇到此错误:
错误:无法在初始化中将“float*”转换为“qreal* {aka double*}”
这是代码片段:
void Camera::loadProjectionMatrix()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
qreal *dataMat = projectionMatrix_.data();
GLfloat matriceArray[16];
for (int i= 0; i < 16; ++i)
matriceArray[i] = dataMat[i];
glMultMatrixf(matriceArray);
}
Run Code Online (Sandbox Code Playgroud)
我有什么选择来克服这个错误?
投影矩阵将float*根据文档返回给您:
\n\n\n浮动 * QMatrix4x4::\xe2\x80\x8bdata()
\n\n返回指向该矩阵的原始数据的指针。
\n
最佳实践是消除qreal代码库中的使用,无论这种情况如何。当贡献者进行 Qt 5 重构时,qreal 古老的概念被尽可能地删除,并且绝对不应该在 API 处理浮点的新代码中过多使用。
现在建议在这种情况下使用浮动。这确实有点历史。当时,在可用的情况下将 qreal 定义为 double 是有意义的,而在不可用的情况下将 qreal 定义为 float 是有意义的,例如 ARM 平台。请参阅旧文档:
\n\n\n \n\n\n\n除使用 ARM 架构 CPU 的平台外,所有平台上的 typedef 均为 double。在基于 ARM 的平台上,出于性能原因,qreal 是 float 的类型定义。
\n
在 Qt 5 中,文档略有不同,但主要概念似乎保持不变:
\n\n\n \n\n\n\n除非使用 -qreal float 选项配置 Qt,否则 typedef 为 double。
\n
我将通过以下方式修复您的代码:
\n\nvoid Camera::loadProjectionMatrix()\n{\n glMatrixMode(GL_PROJECTION);\n glLoadIdentity();\n float *dataMat = projectionMatrix_.data();\n GLfloat matriceArray[16];\n for (int i= 0; i < 16; ++i)\n matriceArray[i] = dataMat[i];\n glMultMatrixf(matriceArray);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n严格来说,您还可以采用另一种方法来解决问题,即使用此方法而不是data():
\n\n\nfloat & QMatrix4x4::\xe2\x80\x8booperator()(int 行,int 列)
\n\n返回对此矩阵中位置(行、列)的元素的引用,以便可以分配该元素。
\n
在这种情况下,您甚至可以消除变量并在迭代中将dataMat项目直接分配给您。matriceArray
更进一步,您应该考虑使用 Qt 库来完成此常见任务,即 或 中的 openglQtGui类Qt3D。如果你做一些自定义的事情,那么混乱低级 opengl API 调用会更有意义。