C++ 布局中有多个QGLWidget

C++ 布局中有多个QGLWidget,c++,qt,opengl,qglwidget,C++,Qt,Opengl,Qglwidget,我想编写一个单线程应用程序,它将显示两个QGLWidget(一个用于3D,一个用于2D)。我试图找到两个QGLWidget同时显示的信息,但没有找到任何对我有帮助的东西 现在,我认为我不需要共享上下文-显示的数据没有以有用的方式关联。这两者应该放在qmain窗口中,最好用qspliter分隔。出于测试目的,我将两个QGLWidget放入QHBoxLayout中,但出于某种原因,一次只显示其中一个。这取决于创建小部件实例的顺序,就像一个小部件以某种方式覆盖了另一个小部件一样。QSplitter根本

我想编写一个单线程应用程序,它将显示两个QGLWidget(一个用于3D,一个用于2D)。我试图找到两个QGLWidget同时显示的信息,但没有找到任何对我有帮助的东西

现在,我认为我不需要共享上下文-显示的数据没有以有用的方式关联。这两者应该放在qmain窗口中,最好用qspliter分隔。出于测试目的,我将两个QGLWidget放入QHBoxLayout中,但出于某种原因,一次只显示其中一个。这取决于创建小部件实例的顺序,就像一个小部件以某种方式覆盖了另一个小部件一样。QSplitter根本没有显示任何内容。如果我尝试对这两个窗口都调用show(),则只会显示一个窗口。(我通过一个QWidget将QGLWidget放在Qmain窗口中,该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和UnfolderView类的代码基本相同(目前)。我假设他们自己没有共享任何内容。

我忘了在ViewsWidget中调用setLayout(),当时我正在将布局放在一起。当我直接将QSplitter设置为QMainWindow的中心小部件时,它就开始工作了。 它似乎已正确呈现,但没有将小部件正确连接在一起的方法。

我忘了在ViewsWidget中调用setLayout(),我正在将布局放在一起。当我直接将QSplitter设置为QMainWindow的中心小部件时,它就开始工作了。
它似乎已正确呈现,但没有将小部件正确连接在一起的方法。

请澄清,您使用的是Qt4还是Qt5?Qt5。我希望我不会因为得到最新版本而犯错误。看起来QGLWidgets由于某种原因无法立即渲染。不是一个就是另一个。其中一个(在编译时)上的hide()使另一个显示u。如果您发布代码,这会有所帮助。很难仅仅从你的描述就知道发生了什么。只是要弄清楚,你是在使用Qt4还是Qt5?Qt5。我希望我不会因为得到最新版本而犯错误。看起来QGLWidgets由于某种原因无法立即渲染。不是一个就是另一个。其中一个(在编译时)上的hide()使另一个显示u。如果您发布代码,这会有所帮助。仅仅从你的描述很难判断发生了什么。所以两个QGLWidget现在都显示得很好了?是的,它们显示得很好。我还记得我第一次使用Qt时是怎么做的。所以现在两个QglWidget都显示得很好了?是的,它们显示得很好。我还记得我第一次使用Qt时是怎么做的。