c++ - 试图从整个应用程序访问 QGLWidget

标签 c++ opengl qt4 qglwidget

我基本上想做的是创建一个 QGLWidget 的实例(或者更确切地说是 QGLWidget 的派生类),将它添加到 QMainWindow ,然后从我的 QTCreator 程序中的任何地方访问 QGLWidget 的渲染上下文,以便能够在我选择的任何地方调用裸 OpenGL。

我尝试过的事情:

1) 创建QGLWidget 的子类OGLWidget 并将其变成单例,然后尝试继承单例类“OGLWidget”。我认为这将使我能够访问 OGLWidget 单例所使用的相同渲染上下文,但它不起作用。

2) 使用构造函数QGLWidget(QWidget * parent, QGLWidget * shared, Qt::WindowFlags)。对于这个,我尝试将单例对象转换为 QGLWidget,然后在我将 QGLWidget 子类化到另一个名为“Display”的类中时将其粘贴到此构造函数中。我尝试在每个类 openGl 调用之前调用 makeCurrent,但只有原始单例会绘制。我还检查了 isSharing 并返回 true。

最佳答案

首先,虽然信号/槽是 Qt 的一个强大而令人敬畏的特性,但由于增加的开销和渲染顺序问题,我永远不会在我的渲染例程中使用它们;特别是后者。此外,没有必要按照您建议的方式进行。 因此,在我看来,您将渲染例程分散在整个项目中是一个非常糟糕的主意。 我在自己的项目中所做的如下:

我派生的 QGLWidget 拥有一个 Renderer 类,该类作为单例实现。它包含几个函数中的所有 OpenGl 调用。我创建了一个系统,其中所有可绘制的东西都来自同一个基类。当我想要渲染时,我构建了一个渲染队列,我将其实现为具有自定义排序功能的 priority_queue。当需要渲染一帧时,我会不停地弹出和渲染,直到队列为空。 使用事件驱动的渲染系统执行此操作,同时保持正确的渲染顺序可能会让您发疯。

为了完整性,我的(简化的)QGLWidget 定义:

#include <QtOpenGL/QGLWidget>

#include "global.h"
#include "renderer.h"

/**
 * Derivation of QGLWidget.
 */
class Engine : public QGLWidget
{
    Q_OBJECT
private:
    Renderer* renderer;
private slots:
    void renderTimeout(); // my render-loop is timer based
    void onTap(QMouseEvent* qme);
    void onMove(QMouseEvent* qme);
protected:
    void initializeGL();
    void resizeGL(int w, int h);
    /* for debugging I use QPainter for drawing overlays, 
     * so I can't use PaintGL */
    void paintEvent(QPaintEvent *event); 
    void mousePressEvent(QMouseEvent* qme);
    void mouseMoveEvent(QMouseEvent* qme);
public:
    Engine( QWidget* parent = 0 );
    ~Engine();
signals:
    void tapOccurred(QMouseEvent* qme);
    void moveOccurred(QMouseEvent* qme);
};

关于c++ - 试图从整个应用程序访问 QGLWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11400466/

相关文章:

c++ - 自定义 QOpenGLWidget 和 GLEW 包括

c++ - 阿拉伯语的布局方向不是根据语言环境确定的(Mac 和 Linux)

c++ - 优化标题

c++ - 我的代码的 Boost 更新问题

c++ - 多个线程的随机数

c++ - 关于foreach循环和性能的几个问题

qt - QMainWindow 设置 frameSize

c++ - 如何将 wchar_t 转换为 int 以显示代码点?

c - OpenGL/GLUT 窗口显示白屏

java - C 和 Java 中 `glVertexAttribPointer` 函数的差异