Более одного QGLWidget в макете

Я хотел бы запрограммировать однопоточное приложение, которое показывало бы два QGLWidget (один для 3D, другой для 2D). Я пытался найти информацию о двух QGLWidget, отображаемых одновременно, но я не нашел ничего, что могло бы мне помочь.

Теперь я думаю, что мне не нужны общие контексты — отображаемые данные не связаны полезным способом. Эти два должны быть помещены в QMainWindow, предпочтительно разделенный QSplitter. В целях тестирования я поместил два QGLWidget в QHBoxLayout, но по какой-то причине только один из них отображается одновременно. Это зависит от порядка создания экземпляров виджетов, как будто один так или иначе перезаписывает другой. QSplitter вообще ничего не показывает. Если я попытаюсь вызвать show () для них обоих, откроется только одно окно. (Я поместил QGLWidgets в QMainWindow через 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 ) );
}

Классы ModelView и UnfoldedView — это практически один и тот же код (пока). Я предполагаю, что они ничего не делят сами.

1

Решение

Я забыл вызвать setLayout () в ViewsWidget, где я собирал макет вместе. QSplitter начал работать, как только я установил его как центральный виджет QMainWindow.
Похоже, что он рендерился правильно, но не имел способа правильно соединить виджеты вместе.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]