gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:15:50 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com