QGLWidget на Ubuntu ничего не показывает

Я использую QGLWidget в проекте с Qt5 на Ubuntu. Класс, который расширяет QGLWidget, очень прост, он просто переопределяет две его виртуальные защищенные функции:

Заголовок:

class MyGLWidget : public QGLWidget {
    Q_OBJECT
public:
    explicit MyGLWidget(QWidget *parent = 0);
protected:
    void initializeGL();
    void paintGL();
};

Реализация:

MyGLWidget::MyGLWidget(QWidget *parent) :
    QGLWidget(parent) {
}
void MyGLWidget::initializeGL() {
    glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
}
void MyGLWidget::paintGL() {
    glClear(GL_COLOR_BUFFER_BIT);
}

Я создал его экземпляр и вызвал его метод show, ожидая, что появится красное окно, но я получил следующее:

введите здесь описание изображения

Окно прозрачное, оно отображает все, что находится под ним.

В чем действительно проблема, и как я могу это исправить? (Я использую Ubuntu 14.04 64bit, Qt5.3 устанавливается напрямую с qt-project.org)


person songziming    schedule 13.06.2014    source источник
comment
Можешь попробовать позвонить glViewport из resizeGL?   -  person pezcode    schedule 13.06.2014
comment
Это выглядит подозрительно, как будто вы пытаетесь выполнить рендеринг с одинарной буферизацией в оконном менеджере композитинга. Вы выделили формат пикселей с двойной буферизацией и правильно ли меняете местами буферы? Неспособность сделать обе эти вещи приведет к этому.   -  person Andon M. Coleman    schedule 13.06.2014


Ответы (1)


Я обнаружил ту же проблему в той же версии Ubuntu и Qt 5.4. Я не знаю точной причины, но думаю, это потому, что команда glClear не принимается и не выполняется графической картой, если только за ней не следуют другие команды отрисовки. Я расширил функцию paintGL, включив в нее классический тестовый код:

void MyGLWidget::paintGL()
{
  glViewport(0, 0, width(), height());
  glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  glClear(GL_COLOR_BUFFER_BIT);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(-20, 20, 20, -20, -1, 1);

  glColor3f(1.0f, 0.0f, 0.0f);
  glBegin(GL_TRIANGLES);
    glVertex3f(10, 10, 0);
    glVertex3f(-10, 10, 0);
    glVertex3f(0, -10, 0);
  glEnd();
}

С дополнительным кодом для рендеринга красного треугольника я обнаружил, что очистка начала работать для меня, чего раньше не было.

person Portponky    schedule 13.09.2014