OpenGL&Qt:在鼠标悬停时显示标签

时间:2019-01-09 00:28:43

标签: c++ qt opengl graphics mouseevent

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

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

  1. 将小部件(例如QLabel)放在{ 场景被渲染。
  2. 直接在OpenGL中渲染方形文本。

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

2 个答案:

答案 0 :(得分:2)

您好,@ 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从头开始做事可能会非常有益,并且会极大地增进您的理解,因为当您没有依赖于抽象层时,您必须熟悉如何完成工作。最终,这取决于您。祝你好运!

答案 1 :(得分:0)

您可以在Qt中使用工具提示。悬停OpenGlWidget时,将显示该字符串。您可以使用工具提示方法mat-datepicker根据场景中的鼠标位置更改工具提示的文本:

showText()

QToolTip::showText(QPoint &position, QString &text, QWidget *w); 方法有更多选项,可以在Qt的tool tip documentation中找到。另外,这里还有更多examples有关如何使用Qt工具提示的信息。