【问题标题】:Adding a QGLWidget to a QMainWindow将 QGLWidget 添加到 QMainWindow
【发布时间】:2012-02-16 14:08:20
【问题描述】:

我有一个带有 QGraphicsView 的 MainWindow 类,我想将它添加到 MainWindow 中,这样我就可以看到实际发生了什么。我现在要做的就是渲染一个立方体。

主要功能

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

主窗口控件

MainWindow::MainWindow( QWidget *parent )
    : QMainWindow( parent ),
      mUi( new Ui::MainWindow ),
      mDisplay( new GLWidget ),
      mScene( new QGraphicsScene )
{
    mUi->setupUi( this );
    //mScene->addWidget( mDisplay );
    QGraphicsView *graphicsView = new QGraphicsView;
    //QGraphicsView::setupViewport( this );
    graphicsView->setViewport( mDisplay );
    graphicsView->show();
}

GLWidget::initializeGL

void GLWidget::initializeGL( void )
{
    glMatrixMode( GL_COLOR );

    glClearColor( 0.0, 0.0, 0.0, 1.0 );

    glMatrixMode( GL_MODELVIEW );

    glClearDepth( 1.0f );

    glEnable( GL_VERTEX_ARRAY );
    glEnable( GL_NORMAL_ARRAY );
    glEnable( GL_DEPTH_TEST );
    glEnable( GL_CULL_FACE );
    glShadeModel( GL_SMOOTH );
    glEnable( GL_LIGHTING );
    glEnable( GL_LIGHT0 );
    glEnable( GL_MULTISAMPLE );
    static GLfloat lightPosition[ 4 ] = { 0.5, 5.0, 7.0, 1.0 };
    glLightfv( GL_LIGHT0, GL_POSITION, lightPosition );

    qDebug() << "GL Initialized" << '\n';
}

如您所见,glClearColor 应该将背景设置为黑屏。问题是当我渲染它时,我看到两个窗口弹出而不是一个。虽然MainWindow 类有一个应该呈现GLWidget 的窗口框架,但似乎不是将其添加到窗口框架,而是使用QGraphicsView 生成框架和窗口.两个窗口都只显示白屏;正如glClearColor 所述,其中一个至少应该显示黑色背景。

我在这里做错了什么?

【问题讨论】:

    标签: c++ qt user-interface opengl qglwidget


    【解决方案1】:

    glClearColor 仅设置将用于清除屏幕的颜色。 要真正清除屏幕,您必须调用 glCear 函数:

    glClear(GL_COLOR_BUFFER_BIT);
    

    与 glClearDepth 相同 - 它只设置要清除的深度值。要真正清除它,请使用相同的 glCler 函数。您可以通过一个 glClear 调用来清除颜色缓冲区和深度缓冲区,如下所示:

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    

    【讨论】:

    • 嗯...看起来你错了:至少根据 Qt 的规范,没有像 GL_COLOR_BUFFER 这样的东西(以及我从 Windows 执行此操作的事实) 7 - Linux 可能不同)。现在,有GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,但是,AFIK 就是这样。
    • 不行,你先调用glClearColor,然后再调用glClear,否则OpenGL在清除的时候不知道用什么颜色。而且是*_BIT,它不是Qt或Linux的东西,名称在OpenGL规范中指定。
    • @Holland:是的,你是对的。我忘记了 _BIT 后缀。你是什​​么意思 - Qt 规范?使用 OpenGL 手册或手册页:opengl.org/sdk/docs/man/xhtml/glClear.xml
    • 好的,谢谢。 OpenGL 的 Qt 规范的运作方式与普通的 OpenGL 规范略有不同。例如,缓冲区绑定完全不同。
    猜你喜欢
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多