我正在尝试编译旧的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);
}
我有什么方法可以克服这个错误?
答案 0 :(得分:4)
投影矩阵将根据文档向您返回float*
:
返回指向此矩阵的原始数据的指针。
最佳做法是消除代码库中的qreal
用法,无论这种情况如何。当贡献者经历了Qt 5重构时,qreal古老概念被尽可能地删除,并且绝对不应该在API处理浮动的新代码中使用太多。
建议在这种情况下使用浮动。这有点历史,真的。那时候,将qreal定义为可用的两倍是有意义的,但浮动的地方不是,例如ARM平台。请参阅旧文档:
除了使用具有ARM体系结构的CPU的平台外,所有平台上的type都为double。在基于ARM的平台上,出于性能原因,qreal是float的typedef。
在Qt 5中,文档略有不同,尽管主要概念似乎保持不变:
除非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类在QtGui
或Qt3D
中。如果你做一些自定义的事情,那么混淆低级别的opengl API调用会更有意义。
答案 1 :(得分:1)
显然,projectionMatrix_.data()
会返回float*
,而您无法将float*
分配给double*
(在这种情况下,qreal*
就是这样)。
使用
float *dataMat = projectionMatrix_.data();
或
auto dataMat = projectionMatrix_.data();
代替。后者有时具有以下优点:如果函数的返回类型由于某种原因而发生变化,它可能仍然是正确的代码,尽管这对于成熟的库来说没什么可期待的。另外,你不能在事故中弄错。