Qt OpenGL 渲染文本问题 QGLWidget

Posted

技术标签:

【中文标题】Qt OpenGL 渲染文本问题 QGLWidget【英文标题】:Qt OpenGL Rendering text issue QGLWidget 【发布时间】:2013-04-29 07:48:31 【问题描述】:

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

【问题讨论】:

renderText 不是我从任何库中都知道的函数。如果它来自图书馆,请告诉我们是哪一个。如果没有,请提供它的代码。 只需使用来源编辑我的帖子。 renderText() 是 Qt 框架内的 OpenGL API 的一部分。您可以根据它以 QString 作为输入的事实来推断。 【参考方案1】:

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

【讨论】:

【参考方案2】:

来自文档:

如果默认的 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状态

【讨论】:

以上是关于Qt OpenGL 渲染文本问题 QGLWidget的主要内容,如果未能解决你的问题,请参考以下文章

opengl 3 qt渲染空白屏幕

OpenGL + QT:渲染到纹理并显示回来

Qt & OpenGL:如何尽可能频繁地渲染?

Qt/OpenGL - 渲染的图元被扭曲

Qt 5.1.1 和 OpenGL - 渲染速度

Qt5快速qml测试和opengl渲染的问题