Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL&;Qt:在鼠标上方显示标签_C++_Qt_Opengl_Graphics_Mouseevent - Fatal编程技术网

C++ OpenGL&;Qt:在鼠标上方显示标签

C++ OpenGL&;Qt:在鼠标上方显示标签,c++,qt,opengl,graphics,mouseevent,C++,Qt,Opengl,Graphics,Mouseevent,我正在使用OpenGL和Qt。我在OpenGLWidget中渲染场景。将鼠标悬停在场景中的对象上时,我希望在选定对象附近显示一个带有一些文本的框。我已经实现了对象的选择 我想到了两种可能的方法 在中的OpenGLWidget上方放置一个小部件(例如QLabel) 渲染场景的对象 直接在OpenGL中以四边形渲染文本 您推荐这两种方法中的哪一种?您可以给我一些实施建议吗。或者,您可以推荐另一种方法。谢谢 Hi@Artic我不是Qt专家,所以我不能给你关于小部件的信息,但我可以给你一些使用OpenG

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

我想到了两种可能的方法

  • 在中的
    OpenGLWidget
    上方放置一个小部件(例如
    QLabel
    ) 渲染场景的对象
  • 直接在OpenGL中以四边形渲染文本

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

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

    要在OpenGL中渲染文本,大多数人都使用称为位图字体的技术,请参见此处的详细信息: 位图字体的概念非常简单,所有字符都被预光栅化为纹理,然后您可以根据需要的字符从纹理的每个部分采样。您可以使用四边形构建标签,并使用位图的每个部分对每个角色进行纹理采样

    有符号距离字段基本上使用相同的技术,但字符的预光栅化纹理是使用有符号距离字段渲染的,该字段处理标准位图字体存在的一些问题

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

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

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

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

    如果只想在屏幕空间中向屏幕渲染一些文本,也可以“动态”渲染文本。您可以使用SDL_ttf之类的库。 见:

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

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

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


    对于使用哪种技术的建议,我将使用您最熟悉的技术,通常在OpenGL中从头开始做事情需要更多的时间,但它可以为您提供更好的功能集以供将来使用。然而,如果Qt已经有了一些很好的工具来呈现标签(比如你提到的一个小部件),那么可能值得花时间来学习如何使用它,因为它可能会产生更快的结果,如果你不需要的话,你也不想重新发明轮子。在这一点上,尽管使用OpenGL从头开始做事情是非常有益的,并且可以极大地提高您的理解力,因为您必须熟悉在没有抽象层可依赖的情况下如何做事情。最终取决于你。祝你好运

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

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

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