2013-03-06 6 views
1

두 개의 QGLWidget (3D 용, 2D 용)이 표시되는 단일 스레드 응용 프로그램을 프로그래밍하고 싶습니다. 한 번에 두 개의 QGLWidgets에 대한 정보를 찾으려고했지만, 도움이되는 정보를 찾지 못했습니다.레이아웃에서 하나 이상의 QGLWidget

이제 공유 컨텍스트가 필요하지 않습니다. 표시된 데이터는 유용한 방식으로 관련되어 있지 않습니다. 두 개는 QMainWindow 내부에 배치해야하며, QSplitter로 분할하는 것이 좋습니다. 테스트 목적으로 두 QGLWidgets를 QHBoxLayout에 넣었습니다. 그러나 어떤 이유로 한 번에 그 중 하나만 표시됩니다. 마치 위젯 인스턴스를 작성하는 순서에 따라 달라집니다. QSplitter는 전혀 표시하지 않습니다. 두 가지 모두에서 show()를 호출하면 하나의 창이 표시됩니다. (QWindow에 QWidget을 배치하여 레이아웃을 함께 넣는 QWidget에 넣습니다.)

위젯을 사용하는 방법과 관련하여 뭔가 빠졌습니까?

메인 창 :

MainWindow::MainWindow(QWidget *parent) 
    : QMainWindow(parent) 
{ 

    ViewsWidget *widget = new ViewsWidget(); 

    this->setCentralWidget(widget); 
    this->resize(640,480); 
} 

ViewsWidget::ViewsWidget() 
{ 
    //create two QGLWidgets 
    ModelView *modelView2 = new ModelView(this); 
    UnfoldedView *unfoldedView2 = new UnfoldedView(this); 

    QHBoxLayout *layout = new QHBoxLayout(); 

    layout->addWidget(modelView2); 
    layout->addWidget(unfoldedView2); 

    unfoldedView2->setMaximumSize(200,100); 
    modelView2->setMaximumSize(200,100); 

} 

QGLWidget :

typedef struct 
{ 
    float XYZW[4]; 
    float RGBA[4]; 
} Vertex; 

GLuint bufferId; 

Vertex Vertices[] = //vertices 
    { 
    }; 

GLubyte Indices[] = { //indices 
}; 

const size_t BufferSize = sizeof(Vertices); 
const size_t VertexSize = sizeof(Vertices[0]); 
const size_t RgbOffset = sizeof(Vertices[0].XYZW); 


static const char *vertexShaderSource = 
    "attribute highp vec4 posAttr;\n" 
    "attribute lowp vec4 colAttr;\n" 
    "varying lowp vec4 col;\n" 
    "uniform highp mat4 matrix;\n" 
    "void main() {\n" 
    " col = colAttr;\n" 
    " gl_Position = matrix * posAttr;\n" 
    "}\n"; 

static const char *fragmentShaderSource = 
    "varying lowp vec4 col;\n" 
    "void main() {\n" 
    " gl_FragColor = col;\n" 
    "}\n"; 

ModelView::ModelView(QWidget *parent) 
{ 

    this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); 
    this->setParent(parent); 

} 

void ModelView::initializeGL() 
{ 

    m_program = new QGLShaderProgram(this); 
    m_program->addShaderFromSourceCode(QGLShader::Vertex, vertexShaderSource); 
    m_program->addShaderFromSourceCode(QGLShader::Fragment, fragmentShaderSource); 
    m_program->link(); 
} 

void ModelView::paintGL() 
{ 

    glClearColor(1.0f, 0.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glViewport(0, 0, 200, 160); 

    m_program->bind(); 

    QMatrix4x4 matrix; 
    matrix.perspective(60, 4.0/3.0, 0.1, 100.0); 
    matrix.translate(0, 0, -2); 

    vertices = (GLfloat *)fileSystem->getVertices(); 
    colors = (GLfloat *)fileSystem->getColors(); 

    m_program->setUniformValue(m_matrixUniform, matrix); 

    m_posAttr = m_program->attributeLocation("posAttr"); 
    m_colAttr = m_program->attributeLocation("colAttr"); 
    m_matrixUniform = m_program->uniformLocation("matrix"); 

    glGenBuffers(1, &BufferId); 

    glBindBuffer(GL_ARRAY_BUFFER, BufferId); 
    glBufferData(GL_ARRAY_BUFFER, BufferSize, Vertices, GL_STATIC_DRAW); 

    glVertexAttribPointer(m_posAttr, 2, GL_FLOAT, GL_FALSE, VertexSize, 0); 
    glVertexAttribPointer(m_colAttr, 3, GL_FLOAT, GL_FALSE, VertexSize, (GLvoid *)RgbOffset); 

    glEnableVertexAttribArray(0); 
    glEnableVertexAttribArray(1); 

    glGenBuffers(1, &IndexBufferId); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBufferId); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW); 

    glDrawElements(GL_TRIANGLES, 48, GL_UNSIGNED_BYTE, NULL); 

    glDisableVertexAttribArray(1); 
    glDisableVertexAttribArray(0); 

    m_program->release(); 

} 

void ModelView::resizeGL(int w, int h) 
{ 
    glViewport(0, 0, w, qMax(h, 1)); 
} 

모델 뷰와 UnfoldedView 클래스가 꽤 많이 (지금은) 동일한 코드이다. 나는 그들이 스스로 아무것도 공유하지 않는다고 가정한다.

+0

Qt4 또는 Qt5로 작업하고 있습니까? – Cameron

+0

Qt5. 저는 최신 버전을 구해서 실수를 저 지르지 않기를 바랬습니다. –

+0

QGLWidgets이 어떤 이유로 든 즉시 렌더링 할 수없는 것처럼 보입니다. 둘 중 하나 또는 다른 것. 그 중 하나 (컴파일 타임에)에있는 hide()는 다른 프로그램을 보여줍니다. –

답변

1

레이아웃을 정리하고있는 ViewsWidget에서 setLayout()을 호출하는 것을 깜박했습니다. QSplitter는 QMainWindow의 중앙 위젯으로 직접 설정하자 마자 작동하기 시작했습니다. 올바르게 렌더링 된 것처럼 보이지만 위젯을 함께 올바르게 연결하는 방법이 없습니다.

+0

이제 두 QGLWidgets 모두 정상적으로 표시됩니까? – Cameron

+0

예, 가능합니다. Qt를 처음 사용할 때 어떻게했는지 기억합니다. –