1

私が基本的にやろうとしているのは、QGLWidget(またはの派生クラスQGLWidget)のインスタンスを1つ作成し、それをに追加してから、QTCreatorプログラムのどこからでもレンダリングコンテキストQMainWindowにアクセスして、QGLWidgetどこからでも裸のOpenGLを呼び出せるようにすることです。私はすることを選びました。

私が試したこと:

1)QGLWidgetcalledのサブクラスを作成OGLWidgetし、それをシングルトンにしてから、シングルトンクラス「OGLWidget」をサブクラス化しようとします。これにより、OGLWidgetシングルトンが使用していたのと同じレンダリングコンテキストにアクセスできると思いましたが、機能しませんでした。

2)コンストラクターを使用しQGLWidget(QWidget * parent, QGLWidget * shared, Qt::WindowFlags)ます。これについては、シングルトンオブジェクトをQGLWidgetにキャストし、「Display」という別のクラスでQGLWidgetをサブクラス化するときに、このコンストラクターに貼り付けてみました。各クラスのopenGlを呼び出す前にmakeCurrentを呼び出してみましたが、元のシングルトンのみが描画されます。isSharingもチェックしたところ、trueが返されました。

4

2 に答える 2

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 に答える
0

まず第一に、signals \ slotはQtの強力で素晴らしい機能ですが、オーバーヘッドとレンダリング順序の問題が追加されるため、レンダリングルーチンでそれらを使用することは決してありません。特に後者。その上、あなたが提案する方法でそれをする必要はありません。したがって、レンダリングルーチンをプロジェクト全体に分散させるというあなたの考えは、私の意見では非常に悪い考えです。私自身のプロジェクトで行っていることは次のとおりです。

私の派生物は、シングルトンとして実装されQGLWidgetたクラスを所有しています。Rendererこれには、いくつかの関数のすべてのOpenGl呼び出しが含まれています。描画可能なものすべてが同じ基本クラスから派生するシステムを作成しました。レンダリングしたいときはpriority_queue、カスタムソート関数を使用して実装したレンダリングキューを作成します。フレームをレンダリングするときは、キューが空になるまでpoppin'とレンダリングを続けます。正しいレンダリング順序を維持しながら、イベント駆動型のレンダリングシステムでこれを行うと、おそらく気が狂ってしまいます。

完全を期すために、私の(簡略化された)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 に答える