我正在使用QGLWidget和此代码在屏幕上绘制文字,但如果字符串的长度太高,渲染就是灾难性的:
这是我的代码:
glPushMatrix();
glRotatef(90, 0, 0, 1);
QString qStr = QString("Here's a very long string which doesn't mean anything at all but had some rendering problems");
renderText(0.0, 0.0, 0.0, qStr);
glPopMatrix();
答案 0 :(得分:3)
使用 Helvetica 时,我遇到了完全相同的问题。将字体更改为 Arial 解决了它。
我在它周围做了一个小包装,以简化操作:
void _draw_text(double x, double y, double z, QString txt)
{
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
qglColor(Qt::white);
renderText(x, y, z, txt, QFont("Arial", 12, QFont::Bold, false) );
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
}
答案 1 :(得分:0)
来自文档:
如果默认的OpenGL绘图引擎是QPaintEngine :: OpenGL,则此函数只能在QPainter :: beginNativePainting()/ QPainter :: endNativePainting()块中使用。要使QPaintEngine :: OpenGL成为默认的GL引擎,请在QApplication构造函数之前调用QGL :: setPreferredPaintEngine(QPaintEngine :: OpenGL)。
因此,您是否尝试在通话之前使用QPainter::beginNativePainting()
,之后只使用QPainter::endNativePainting()
?
另外,请注意,文本是以窗口坐标呈现的,而不考虑您当前的所有OpenGL矩阵状态(简而言之,您的glRotatef(90, 0, 0, 1)
调用无效)。您可以在实现here中看到他们通过调用qt_save_gl_state()
来保存您当前的OpenGL状态,然后创建他们的全新矩阵:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, width, height);
glOrtho(0, width, height, 0, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
然后绘制文本,最后使用qt_restore_gl_state()