关于QOpenGLWidget上显示文本的方法

这是笔者在BBS上的一篇文章,现转载到这里

本文是笔者关于QOpenGLWidget显示文本的笔记。方法在网上都可以找到。不当之处欢迎指正!
类别一、显示2D文本

该方式为将文本内容显示在QOpenGLWidget上,不随视角变化。
应用:3D场景的图例或内容描述。
优点:相对于在其他部位显示优点是截图时带着文本内容。
缺点:QPainter内容不被消隐,不适合显示面片信息
方法:在OpenGL中混合QPainter命令。这部分教程比较多,可以在网上搜。
类别二、显示3D文本

该方式为将文本内容显示在QOpenGLWidget中的面片上,需要随视角变化,支持消隐。
图片方式

用QPainter 将显示的字符串写在QImage上,背景透明。然后将QImage当做材质贴在一个多边形上。
优点:文本美观,支持各种字体。
缺点:1.多边形边界的计算比较麻烦,影响贴图质量。
2.生成的图片文件不能太大,否则申请数组会出问题。

QImage* COPenGLText::Text2Image(GLuint ID)
{
QSize size(m_width32/m_height,32 ); // m_width,m_height 字符串宽高要先算好,生成高为32点的图片
QImage imgDraw = new QImage(size, QImage::Format_ARGB32);
imgDraw->fill(Qt::transparent);
QPainter* painter = new QPainter(imgDraw);
painter->setRenderHint(QPainter::Antialiasing, true); // 反走样
painter->setBackgroundMode(Qt::TransparentMode); // 背景透明,影响到text
painter->begin(m_Parent);
painter->setPen(getColor()); // 文字颜色
QFont txFont(csFont, 32.);
painter->setFont(txFont);
painter->drawText(1, 31, text); // 字高小一点,避免缺失内容
painter->end();
return imgDraw;
QPainterPath方式:

将文本写在QPainterPath上,然后得到多边形,最后在OpenGL中绘制多边形的线框。
优点:代码量小,内存消耗小。
缺点:1.QPainterPath内有圆弧和曲线,用直线代替精度低,可以先离散曲线再绘制。
2.需要填充的话需要添加大量代码,如多边形包含计算,三角化等。
综合评价,我选择用QPainterPath的线框方式。
部分代码如下:

          。。。  先生成文本的变换矩阵,依据,绕三个轴的转角以及参考点坐标。
          QPainterPath path;            
            glDisable(GL_LIGHTING);
     
            QFont font(csFont, zh);
            path.addText(QPointF(0, 0), font, text);
            QList<QPolygonF> poly = path.toSubpathPolygons();
                
            for (QList<QPolygonF>::iterator i = poly.begin(); i != poly.end(); i++) {

// glBegin(GL_LINE_LOOP);
glBegin(GL_POLYGON);

                glColor3f(aText.rgb[0]/256., aText.rgb[1] / 256., aText.rgb[2] / 256.);
                for (QPolygonF::iterator p = (*i).begin(); p != (*i).end(); p++)
                {
                    double x3,y3, z3;
                    aText.Local2Word(p->rx(), zh -p->ry(), x3, y3, z3);  // 坐标转换
                    glVertex3f(x3, y3, z3);
                }                                    
                glEnd();
            }
            glEnable(GL_LIGHTING);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QOpenGLWidgetQt中的一个用于在OpenGL上下文中显示图形的小部件。要在QOpenGLWidget显示QImage,可以按照以下步骤进行操作: 1. 创建一个继承自QOpenGLWidget的自定义小部件类,并重写其initializeGL、resizeGL和paintGL函数。 2. 在initializeGL函数中,进行OpenGL的初始化工作,例如设置背景颜色、启用深度测试等。 3. 在resizeGL函数中,根据窗口大小调整OpenGL视口的大小。 4. 在paintGL函数中,进行绘制操作。这里需要将QImage转换为OpenGL可用的纹理,并使用OpenGL的绘制函数进行绘制。 下面是一个简单的示例代码: ```cpp class MyOpenGLWidget : public QOpenGLWidget { public: MyOpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {} protected: void initializeGL() override { // 初始化OpenGL glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glEnable(GL_DEPTH_TEST); } void resizeGL(int w, int h) override { // 调整OpenGL视口大小 glViewport(0, 0, w, h); } void paintGL() override { // 绘制操作 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 将QImage转换为OpenGL纹理 QImage image; // 假设已经有一个QImage对象image GLuint texture; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, image.bits()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 绘制纹理 glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex2f(1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0f, 1.0f); glEnd(); // 删除纹理 glDeleteTextures(1, &texture); } }; ``` 使用这个自定义的MyOpenGLWidget类,你可以将其添加到你的Qt应用程序中,并在其中显示QImage。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

imz2y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值