错误:无法在初始化中将“float*”转换为“qreal* {aka double*}”

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)

我有什么选择来克服这个错误?

lpa*_*app 5

投影矩阵将float*根据文档返回给您:

\n\n
\n

浮动 * QMatrix4x4::\xe2\x80\x8bdata()

\n\n

返回指向该矩阵的原始数据的指针。

\n
\n\n

最佳实践是消除qreal代码库中的使用,无论这种情况如何。当贡献者进行 Qt 5 重构时,qreal 古老的概念被尽可能地删除,并且绝对不应该在 API 处理浮点的新代码中过多使用。

\n\n

现在建议在这种情况下使用浮动。这确实有点历史。当时,在可用的情况下将 qreal 定义为 double 是有意义的,而在不可用的情况下将 qreal 定义为 float 是有意义的,例如 ARM 平台。请参阅旧文档:

\n\n
\n

typedef qreal

\n\n

除使用 ARM 架构 CPU 的平台外,所有平台上的 typedef 均为 double。在基于 ARM 的平台上,出于性能原因,qreal 是 float 的类型定义。

\n
\n\n

在 Qt 5 中,文档略有不同,但主要概念似乎保持不变:

\n\n
\n

typedef qreal

\n\n

除非使用 -qreal float 选项配置 Qt,否则 typedef 为 double。

\n
\n\n

我将通过以下方式修复您的代码:

\n\n
void 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

严格来说,您还可以采用另一种方法来解决问题,即使用此方法而不是data()

\n\n
\n

float & QMatrix4x4::\xe2\x80\x8booperator()(int 行,int 列)

\n\n

返回对此矩阵中位置(行、列)的元素的引用,以便可以分配该元素。

\n
\n\n

在这种情况下,您甚至可以消除变量并在迭代中将dataMat项目直接分配给您。matriceArray

\n\n

更进一步,您应该考虑使用 Qt 库来完成此常见任务,即 或 中的 openglQtGuiQt3D。如果你做一些自定义的事情,那么混乱低级 opengl API 调用会更有意义。

\n