Qt OpenGL渲染文本问题QGLWidget

时间:2013-04-29 07:48:32

标签: c++ qt opengl rendering

我正在使用QGLWidget和此代码在屏幕上绘制文字,但如果字符串的长度太高,渲染就是灾难性的:text rendering issue

这是我的代码:

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();

2 个答案:

答案 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()

恢复以前的OpenGL状态