문제

나는 이전에 qglwidget에서 파생되었습니다.

class MyGLWidget : public QGLWidget
{
public:
   // stuff...

   virtual void initializeGL() { /* my custom OpenGL initialization routine */ }

   // more stuff...
};

그러나 Viewport로 사용자 정의 qglwidget을 사용하여 QgraphicsView를 초기화하려고하면 InitializeGl이 호출되지 않습니다 (QT 라이브러리 내에서 중단 점을 설정하면 qglwidget :: initializegl ()이 없음).

// initializeGL, resizeGL, paintGL not called
ui.graphicsView->setViewport(new MyGLWidget(QGLFormat(QGL::DoubleBuffer)));

// initializeGL, resizeGL, paintGL *still* not called
ui.graphicsView->setViewport(new QGLWidget(QGLFormat(QGL::DoubleBuffer)));

현재 myglwidget :: initializegl ()에있는 코드를 배치 할 수있는 올바른 위치는 어디에 있습니까?

도움이 되었습니까?

해결책 5

나는 계속해서 내 자신의 질문에 대답 할 것입니다. 이것은 최적이 아니지만 이것이 내가 문제를 해결하는 방법입니다.

대신에

ui.graphicsView->setViewport(new MyGLWidget(QGLFormat(QGL::DoubleBuffer)));

대신 이것을 얻었습니다.

ui.graphicsView->setViewport(new QGLWidget(new CustomContext(QGLFormat(QGL::SampleBuffers))));

CustomContext는 qglcontext에서 파생되는 클래스입니다. 그렇게하는 것과 같은 Create Member를 대체했습니다.

virtual bool create(const QGLContext *shareContext = 0)
{
    if(QGLContext::create(shareContext))
    {
        makeCurrent();

        /* do my initialization here */

        doneCurrent();

        return true;
    }

    return false;
}

나는 이것이 이것을하는 최적의 방법이라고 생각하지 않지만, 특정 초기화 단계가 전혀없는 대안보다 낫습니다. 나는 여전히 누군가가 더 나은 답을 남기도록 기뻐할 것입니다!

다른 팁

사용자 정의 qgraphicsview의 setupviewport 슬롯은 qglwidget에서 updategl ()을 호출하는 데 사용될 수 있습니다.

class MyGraphicsView : public QGraphicsView
{
    //... The usual stuff

protected slots:
    virtual void setupViewport(QWidget *viewport)
    {
        QGLWidget *glWidget = qobject_cast<QGLWidget*>(viewport);
        if (glWidget)
            glWidget->updateGL();
    }

};

따라서 내가 찾은 것은 qgraphicsView QGLWIDGET 뷰포트에 사용자 정의 이벤트 필터를 설치하므로 초기화/크기를 다시 확인/리 페인트하는 이벤트를 볼 수 없습니다. 이것은 아마도 단점 () 등으로 제대로 작동하도록하기 위해 이루어 졌을 것입니다.

현재 가장 좋은 해상도는 QgraphicsView :: Resizeevent ()/etc에서 원하는 이벤트를 포착하거나 QGRAPHICSVIEW의 사용자 정의 이벤트 필터가 제기하기 전에 QGLWIDGET 파생 클래스에 사용자 정의 이벤트 필터를 설치하는 것입니다.

고통, 통증, ... qglwidgets에서 파생 된 위젯을 QgraphicsView에 통합하는 것은 재미가 없습니다. QT의 일부는 이것이 확실히 더 지저분한 영역 중 하나라는 것을 알고 있습니다. 나는 결국 일부를 사용했다 kgllib (KDE에서) QGLWIDGET 주변의 매우 괜찮은 래퍼 인 WidgetProxy라고합니다. 나는 내 요구에 맞게 수정했지만 qgraphicsview 내부의 qglwidget에서 파생 된 진동 클래스를 사용하고 그 위에 다른 것들을 그리는 대부분의 일반적인 경우에 합리적으로 잘 작동합니다.

initializeGL() 첫 번째 호출까지 전화를받지 않습니다 paintGL() 또는 resizeGL() 위젯이 구성된시기가 아닙니다. 위젯이 처음 보이게 될 때처럼 늦을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top