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的主要内容,如果未能解决你的问题,请参考以下文章