2012-07-09 4 views
1

내가 기본적으로해야 할 시도하고의 인스턴스를 생성하는 것입니다 QGLWidget (또는 오히려 QGLWidget의 파생 클래스)하는 QMainWindow에 추가 한 다음 QGLWidget의 렌더링 컨텍스트에 액세스 내 QTCreator 프로그램의 어느 곳에서나 naked OpenGL을 호출 할 수있게되었습니다.은 전체 응용 프로그램에서 QGLWidget에 액세스하려고

1) QGLWidget라는 OGLWidget의 서브 클래스를 생성 및 싱글로 그 제작, 다음 싱글 클래스 "OGLWidget"를 서브 클래 싱을 시도 : 나는 시도

것. 나는 이것이 OGLWidget 싱글 톤이 사용하는 것과 동일한 렌더링 컨텍스트에 대한 액세스를 제공 할 것이라고 생각했지만 작동하지 않았다.

2) 생성자 QGLWidget(QWidget * parent, QGLWidget * shared, Qt::WindowFlags)을 사용하십시오. 이 중 하나에 대해 QGLWidget에 싱글 톤 객체를 캐스팅 한 다음 QGLWidget을 "Display"라는 다른 클래스에서 서브 클래스로 만들 때이 생성자에 고정 시켰습니다. 각 클래스 openGl 호출하기 전에 makeCurrent 호출했지만 원래 싱글 톤 그릴 것이라고 시도했다. 나는 또한 isSharing을 확인했고 그것은 사실로 돌아갔다.

답변

0

첫째, 슬롯 \ 신호 Qt는 강력하고 멋진 기능은 내가 오버 헤드 때문에 추가의 내 렌더링 루틴을 사용하지 질서 문제를 렌더링 않을 것입니다 있지만; 특히 후자. 게다가, 당신이 제안하는 방식대로 할 필요는 없습니다. 따라서 프로젝트 전체에서 렌더링 루틴을 분산시키려는 생각은 제 의견으로는 아주 나쁜 생각입니다. 내 프로젝트에서 수행하는 작업은 다음과 같습니다.

내 파생물 QGLWidget은 싱글 톤으로 구현 된 Renderer 클래스를 소유하고 있습니다. 여기에는 몇 가지 기능으로 OpenGl 호출이 모두 포함되어 있습니다. 나는 drawable 인 모든 것이 같은 기본 클래스에서 파생되는 시스템을 만들었습니다. 렌더링을 원할 때 나는 사용자 정의 정렬 기능을 사용하여 priority_queue으로 구현 한 렌더링 대기열을 만듭니다. 프레임을 렌더링 할 때 큐를 비울 때까지 렌더링을 계속 진행합니다. 올바른 렌더링 순서를 유지하면서 이벤트 구동 렌더 시스템에서이를 수행하면 미칠 수 있습니다. 완성도를 들어

, 내 (간체) QGLWidget 정의 : 내 의견이 디버깅 OpenGL은 렌더링 버그 열심히 함께 끔찍한 스파게티 코드가 발생합니다에서

#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); 
}; 
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(); 
} 
+0

. 나는 signals \ slots가 Qt를 사용할 때 거의 필수적이지만 수신 객체가 전역 상태 (이 경우 OpenGl)에 종속적이지 않을 때만 사용한다는 것에 동의합니다. – pauluss86

+0

맞아, 니가 무슨 뜻인지 알지만, 나는 그다지 동의하지 않는다. 프로그램이 얼마나 복잡 하느냐에 달려 있다고 생각하지만이 방법은 항상 비교적 작은 규모의 응용 프로그램에서 완벽하게 작동합니다. 덧붙여 말하자면, 대부분의 Qt 예제 프로젝트의 접근법과 꽤 비슷합니다. – Yellow

+0

작은 응용 프로그램의 경우 잘 작동 할 것입니다. 이것은 또한 내 경험입니다. 현재 안드로이드 게임에서 일하고 있으며 모든 OpenGl 코드를 단일 클래스로 옮긴 후 다시 태어났습니다.엄격한 렌더링 순서가 필요하다는 점을 알아야하며, 렌더링 매개 변수가 다른 많은 개체가 있으며 상태 변경을 쉽게 최소화 할 수있는 방법이 필요했습니다. 그래서 나는 내 대답에 설명 된 방법에 정착했다. 그러나 이것은 대부분 맛이 \ 의견 예, 거기에 내가이 경로를 취하게 만든 성능 문제가 없었다. – pauluss86

관련 문제