【问题标题】:OpenGL & Qt : display a label on the mouseoverOpenGL & Qt:在鼠标悬停时显示标签
【发布时间】:2019-01-09 00:28:43
【问题描述】:

我正在使用 OpenGL 和 Qt。我在OpenGLWidget 中渲染了一个场景。当悬停在场景中的对象上时,我想在所选对象附近显示一个带有一些文本的框。我已经实现了对象的选择。

我想到了两种可能的方法。

  1. OpenGLWidget 上方放置一个小部件(例如QLabel) 渲染场景。
  2. 直接在 OpenGL 中渲染四边形中的文本。

您推荐两种方法中的哪一种,您可以给我一些关于实施的建议。或者,您可以推荐另一种方法。谢谢!

【问题讨论】:

    标签: c++ qt opengl graphics mouseevent


    【解决方案1】:

    嗨@Artic,我不是Qt 专家,所以我无法为您提供有关小部件的信息,但我可以为您提供一些使用OpenGL 创建标签的指导。在这里给出一个完整的实现是很棘手的,因为它很大程度上取决于你想要如何显示文本。但我会尝试概述您的一些选择。

    为了在 OpenGL 中渲染文本,大多数人使用一种称为位图字体的技术,请在此处查看更多信息: https://learnopengl.com/In-Practice/Text-Rendering 位图字体的概念相当简单,所有字符都预先光栅化为纹理,然后您可以根据需要的字符从纹理的每个部分进行采样。你用四边形构建你的标签,用你为每个字符采样的位图的每个部分进行纹理化。

    有符号距离场基本上使用相同的技术,但字符的预光栅化纹理是使用有符号距离场呈现的,它处理了标准位图字体所具有的一些问题。

    在基本术语中,SDF 的工作原理是生成一个特殊的字体纹理或图像,存储从每个字符的边缘到其中心的距离,使用图像的颜色通道来记录数据。

    如果您使用有符号距离场,仅从位图中采样是不够的,以这种方式渲染的字体需要额外的工作(通常使用着色器程序完成)才能产生正确的渲染。

    一旦你有了生成标签的方法,你就可以决定是在屏幕空间还是在世界空间中显示它。

    如果您想在世界空间中显示它(标签悬停在模型或项目上),如果您希望该标签始终面向相机,则需要做更多的工作,这种技术称为广告牌。

    如果您只想在屏幕空间中将一些文本呈现到屏幕上,您也可以“即时”呈现您的文本。您可以使用像 SDL_ttf 这样的库。 见:http://lazyfoo.net/tutorials/SDL/16_true_type_fonts/index.php

    在此示例中,您使用 SDL_ttf 将文本字符串渲染到具有您选择的尺寸的表面,然后您可以从该表面创建 OpenGL 纹理并将其渲染到屏幕上。

    很抱歉,如果此信息有点宽泛,我需要一个更具体的问题来为您提供进一步的实施细节。

    对于实施,我会根据您的需要评估利弊。如果您之前还没有实现用于呈现文本的系统,那么最好坚持使用简单的东西;文本渲染的技术比我在这里列出的要多,例如将文本转换为多边形和其他库,它们试图处理传统字体渲染技术的一些问题,但您可能不需要任何复杂的东西。

    对于使用的建议,我会使用您觉得最舒服的技术,通常在 OpenGL 中从头开始做事情会花费更多时间,但它可以为您提供更好的功能集以供将来使用.但是,如果 Qt 已经有一些不错的东西可以渲染标签(例如您提到的小部件),那么可能值得花时间学习如何使用它,因为它可能会产生更快的结果,并且您不想重新发明轮子,如果你不需要。需要注意的是,尽管使用 OpenGL 从头开始​​做事情会非常有益,并且可以极大地提高您的理解力,因为当您没有依赖抽象层时,您必须熟悉事情是如何完成的。最终取决于你。祝你好运!

    【讨论】:

      【解决方案2】:

      您可以在 Qt 中使用工具提示。当 OpenGlWidget 悬停在上面时,该字符串将出现。您可以根据鼠标在场景中的位置更改工具提示的文本,使用工具提示方法showText()

      QToolTip::showText(QPoint &position, QString &text, QWidget *w);
      

      showText() 方法有更多选项,可以在 Qt 的tool tip documentation 中找到。另外,这里还有更多关于如何使用Qt工具的examples

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多