qt의 qgraphicsview :: setViewport를 맞춤형 qglwidget으로 호출
-
12-09-2019 - |
문제
나는 이전에 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()
위젯이 구성된시기가 아닙니다. 위젯이 처음 보이게 될 때처럼 늦을 수 있습니다.