1

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

我尝试过的事情:

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

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

4

2 回答 2

0

首先,虽然信号\插槽是 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);
};
于 2012-08-31T22:00:39.827 回答
0

为什么不直接使用 Qt 的设计用途:使用信号和插槽?也许你的问题比我乍一看更复杂,但在我看来,如果你添加插槽QGLWidget并将它们连接到应用程序中的任何位置的信号,你就可以完成你想要的。例如,可以在QMainWindow. 然后这个槽可以调用一个实现paintGL()paintEvent()更新QGLWidget. 像这样:

class MyQGLWidget : public QGLWidget {
// constructors and destructor...

protected:
    void paintGL();      // <-- implement this in any way you want if you use OpenGL
    void paintEvent();   // <-- or implement this one if you prefer using QPainter

public slots:
    void updateMyWindow();
}

void MyQGLWidget::updateMyWindow() {
    // Change some data here in any way you like
    // ...

    paintGL();
}
于 2012-08-13T11:10:37.963 回答