错误:无法转换'浮动*'初始化中的' qreal * {aka double *}

时间:2014-12-28 19:48:11

标签: c++ qt opengl mingw

我正在尝试编译旧的Qt项目,我遇到了这个错误:

  

错误:无法转换'浮动*'到#q; * {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);
}

我有什么方法可以克服这个错误?

2 个答案:

答案 0 :(得分:4)

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

  

float * QMatrix4x4::​data()

     

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

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

建议在这种情况下使用浮动。这有点历史,真的。那时候,将qreal定义为可用的两倍是有意义的,但浮动的地方不是,例如ARM平台。请参阅旧文档:

  

typedef qreal

     

除了使用具有ARM体系结构的CPU的平台外,所有平台上的type都为double。在基于ARM的平台上,出于性能原因,qreal是float的typedef。

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

  

typedef qreal

     

除非Qt配置了-qreal float选项,否则Typedef为double。

我会按照以下方式修复您的代码:

void Camera::loadProjectionMatrix()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    float *dataMat = projectionMatrix_.data();
    GLfloat matriceArray[16];
    for (int i= 0; i < 16; ++i)
        matriceArray[i] = dataMat[i];
    glMultMatrixf(matriceArray);
}

严格地说,你也可以采用另一种方法解决问题,即使用这种方法而不是data()

  

float & QMatrix4x4::​operator()(int row, int column)

     

返回对此矩阵中位置(行,列)的元素的引用,以便可以将元素赋值。

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

除此之外,你应该考虑使用Qt库来完成这项常见任务,例如: opengl类在QtGuiQt3D中。如果你做一些自定义的事情,那么混淆低级别的opengl API调用会更有意义。

答案 1 :(得分:1)

显然,projectionMatrix_.data()会返回float*,而您无法将float*分配给double*(在这种情况下,qreal*就是这样)。

使用

float *dataMat = projectionMatrix_.data();

auto dataMat = projectionMatrix_.data();

代替。后者有时具有以下优点:如果函数的返回类型由于某种原因而发生变化,它可能仍然是正确的代码,尽管这对于成熟的库来说没什么可期待的。另外,你不能在事故中弄错。