4

我正在使用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();
4

2 回答 2

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);
}
于 2013-09-17T04:35:09.997 回答
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)调用无效)。您可以在此处的实现中看到,他们通过调用 保存您当前的 OpenGL 状态qt_save_gl_state(),然后使用以下命令创建他们全新的矩阵:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, width, height);
glOrtho(0, width, height, 0, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

然后绘制文字,最后用qt_restore_gl_state()

于 2013-06-13T07:13:14.700 回答