我基本上想做的是创建一个 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/