首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Qt: QOpenGLWidget中的文本呈现

Qt: QOpenGLWidget中的文本呈现
EN

Stack Overflow用户
提问于 2015-04-12 13:49:20
回答 4查看 4K关注 0票数 2

我想在QOpenGLWidget上绘制文本标签。我尝试使用QPainter来完成这个任务,但是没有成功--文本看起来很难看,而且没有消除锯齿。它在Qt OpenGL/2D绘图示例中看起来也很难看。然而,在同样使用OpenGL后端的QML控件中,文本呈现效果要好得多。在这里,我找到了一种在http://blog.qt.io/blog/2011/07/15/text-rendering-in-the-qml-scene-graph/中使用的技术。有没有办法使用这种技术在QOpenGLWidget中绘制文本?

PS:也许正确的方法是将我所有的场景嵌入到QQuickWidget的QSGSceneGraph中?

EN

回答 4

Stack Overflow用户

发布于 2015-07-10 22:09:49

确保使用支持抗锯齿多重采样的表面格式创建QGL/QopenGLWidget:

代码语言:javascript
复制
QSurfaceFormat format = QSurfaceFormat::defaultFormat();
format.setSamples(4);
QOpenGLWidget * glWidget = new QOpenGLWidget;
glWidget->setFormat(format);

然后,在该小部件上使用QPainter时,请确保启用了抗锯齿功能:

代码语言:javascript
复制
QPainter painter(paintDevice);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);

然后画出你的文字。

票数 2
EN

Stack Overflow用户

发布于 2015-12-16 23:31:30

重新实现旧的QOGLWidget的renderText()以方便文本呈现。这样,文本将随场景移动。如果你想要一个静态版本,你可以简化它。

使用以下方法从QOpenGLWidget (本例中为GLBox)继承了一个类:

renderText:

代码语言:javascript
复制
void GLBox::renderText(D3DVECTOR &textPosWorld, QString text)
{
    int width = this->width();
    int height = this->height();

    GLdouble model[4][4], proj[4][4];
    GLint view[4];
    glGetDoublev(GL_MODELVIEW_MATRIX, &model[0][0]);
    glGetDoublev(GL_PROJECTION_MATRIX, &proj[0][0]);
    glGetIntegerv(GL_VIEWPORT, &view[0]);
    GLdouble textPosX = 0, textPosY = 0, textPosZ = 0;

    project(textPosWorld.x, textPosWorld.y, textPosWorld.z, 
                &model[0][0], &proj[0][0], &view[0],
                &textPosX, &textPosY, &textPosZ);

    textPosY = height - textPosY; // y is inverted

    QPainter painter(this);
    painter.setPen(Qt::yellow);
    painter.setFont(QFont("Helvetica", 8));
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    painter.drawText(textPosX, textPosY, text); // z = pointT4.z + distOverOp / 4
    painter.end();
}

项目:

代码语言:javascript
复制
inline GLint GLBox::project(GLdouble objx, GLdouble objy, GLdouble objz,
    const GLdouble model[16], const GLdouble proj[16],
    const GLint viewport[4],
    GLdouble * winx, GLdouble * winy, GLdouble * winz)
{
    GLdouble in[4], out[4];

    in[0] = objx;
    in[1] = objy;
    in[2] = objz;
    in[3] = 1.0;
    transformPoint(out, model, in);
    transformPoint(in, proj, out);

    if (in[3] == 0.0)
        return GL_FALSE;

    in[0] /= in[3];
    in[1] /= in[3];
    in[2] /= in[3];

    *winx = viewport[0] + (1 + in[0]) * viewport[2] / 2;
    *winy = viewport[1] + (1 + in[1]) * viewport[3] / 2;

    *winz = (1 + in[2]) / 2;
    return GL_TRUE;
}

最后是transformPoint:

代码语言:javascript
复制
inline void GLBox::transformPoint(GLdouble out[4], const GLdouble m[16], const GLdouble in[4])
{
#define M(row,col)  m[col*4+row]
    out[0] =
        M(0, 0) * in[0] + M(0, 1) * in[1] + M(0, 2) * in[2] + M(0, 3) * in[3];
    out[1] =
        M(1, 0) * in[0] + M(1, 1) * in[1] + M(1, 2) * in[2] + M(1, 3) * in[3];
    out[2] =
        M(2, 0) * in[0] + M(2, 1) * in[1] + M(2, 2) * in[2] + M(2, 3) * in[3];
    out[3] =
        M(3, 0) * in[0] + M(3, 1) * in[1] + M(3, 2) * in[2] + M(3, 3) * in[3];
#undef M
}
票数 1
EN

Stack Overflow用户

发布于 2018-07-08 03:02:21

向画笔添加一点旋转似乎可以增加文本的流畅度,但质量有些平庸:

代码语言:javascript
复制
painter.rotate(0.01);
painter.drawText(textPosX, textPosY, text);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29586415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档