두 개의 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 클래스가 꽤 많이 (지금은) 동일한 코드이다. 나는 그들이 스스로 아무것도 공유하지 않는다고 가정한다.
Qt4 또는 Qt5로 작업하고 있습니까? – Cameron
Qt5. 저는 최신 버전을 구해서 실수를 저 지르지 않기를 바랬습니다. –
QGLWidgets이 어떤 이유로 든 즉시 렌더링 할 수없는 것처럼 보입니다. 둘 중 하나 또는 다른 것. 그 중 하나 (컴파일 타임에)에있는 hide()는 다른 프로그램을 보여줍니다. –