저는 C++로 작성된 작은 시각화 프레임 워크를 가지고 있으며 적절한 GUI를 가지고 시각화를 제어하기 위해 Qt를 사용하려고합니다. 현재 GLUT을 사용하여 창을 만들고보기를 그립니다. 그래서 모든 것은 저에게 모든 것을 해주는 클래스 시각화의 객체를 초기화하는 것입니다 : 모델과 뷰를 유지하는 것. 뷰 자체에는 사용자 입력을 처리하고 모델을 조작하는 컨트롤러가 있습니다. 내 메인 루프는 다음과 같습니다 GLUT와Qt를 미리 작성된 응용 프로그램/프레임 워크에 통합하십시오.
Visualization* vis = new Visualization();
vis->createModel("some_file.txt");
vis->createView("unknown");
// ...
void demo_app::display()
{
// clear the framebuffer
glClearColor(0.3, 0.3, 0.3, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
vis.update(); // looks for dirty scenes to update
vis.render(); // draws all views which are stored in vis
glutSwapBuffers();
}
은 내가 여러 뷰를 정렬하는 하나의 창을 가지고있다. 내가 메인 루프 동안 glCommands를 실행할 수있는 무승부보기를 주문하고 모든 것이 좋습니다.
이제 내 문제는 Qt를 여러 창 (QDialogs
+ QGLWidgets
)과 함께 사용하고 싶습니다. 나는 Qt에 익숙하며 이미 Qt에 프레임 워크를 이식했다. 그러나 문제는 프레임 워크 내에서 너무 많은 Qt 통합을 수행해야한다는 것이고 이것이 내가 원하는 것이 아니란 것입니다. Qt와 GUI 요소를 사용하여 시각화를 제어하려고하지만 뷰의 그리기 호출은 GLUT 예제에 표시된 것처럼 시각화 클래스에서 수행해야합니다. 따라서 상속 된 QGLWidget
에 뷰 객체에 대한 포인터를주는 방법이 있어야하며 뷰를 그릴 때마다 위젯은 makeCurrent()
을 호출해야합니다. 그러면 glCommands가 컨텍스트에서 그릴 수 있습니다. 내 뷰에서 현재 장면을 칠한 다음 QGLWidget
의 paintGL 또는 함수에서 텍스처를 그릴 수 있지만 뷰에 대해 알지 못하면 update()
으로 위젯을 어떻게 말할 수 있습니까? QTimer
이 0으로 설정된 메인 루프를 에뮬레이션합니다. 내가하고 싶은 것은 프레임 워크 내에서 QGLWidget
의 렌더링을 트리거 할 수있는 것입니다. 어떠한 제안? 모래밭? 예?
QGLWidget 내에서 내 demo_app :: display()를 호출하고 싶지 않습니다. 이것은 메인 루프에서 실행되어야하며 뷰는 스스로를 그려야합니다. 나는'viewGL()'이 나의 주요 디스플레이 기능을 트리거하기를 원하지 않는다. 왜냐하면 다른 뷰를 가진 다중'QGLWidgets'이 있어야하기 때문이다. –
@iam_peter : "이것은 메인 루프에서 실행되어야합니다."음, 아니요. 틀렸어요. 메인 루프 내에서 "디스플레이"를 수동으로 호출 할 이유가 없습니다. (** 아마 ** 당신이 전체 화면 어플리케이션을 사용하지 않는다면). Qt는 이런 식으로 작동하지 않습니다. 위젯은 필요할 때'paint' /'paintGL'를 호출합니다. 연속적으로 다시 그리기를 원하면'update '를 계속 호출하십시오. 메인 루프 내에서 여러 위젯을 연속적으로 다시 칠하면 CPU가 낭비되고 유용하지 않습니다. – SigTerm
표시 기능은 일부 모델 변경으로 인해 어떤보기를 다시 그려야하는지 결정합니다. 이 메커니즘은 Qt로 보내져서는 안됩니다. 이것은 필자의 시각화 클래스에 의해 수행되어야하는데, 이는 필자가 메인 루프에서 display/update를 호출하는 이유입니다. 디스플레이 호출 중 뷰가 다시 그려지기 때문에 이것은 Qt에 의해 트리거되어서는 안됩니다. Qt가해야 할 모든 일은 사용자 상호 작용에 대한 내 관점을 알려줌으로써 뷰를 더럽게 설정하는 것입니다. 내 스케줄러 (= 시각화)가 다른 모든 것을 시작해야합니다. –