LINUX.ORG.RU

[Qt 4.1.4] Painting over QGLWidget


0

0

Всем привет.

Возникла необходимость совмещать вывод OpenGL и QPainter. Посмотрел на пример "Overpainting". Вроде бы всё работает. В процессе "тыкания" наткнулся на вот такой момент: функция glClear() не работает как положено при вызове её внутри скобок QPainter::begin(), QPainter::end(). Например код (приведу ниже, чтобы не ломать форматирование) должен (по моему розумению) выводить окно красного цвета. Но этого не происходит - выводится обычное окно. Куда копать?

★★★★★

Файл Test.hpp:
#ifndef __TEST_HPP
#define __TEST_HPP

#include <QGLWidget>

class QPaintEvent;

class Test : public QGLWidget
{
    Q_OBJECT

public:
    Test(QWidget * parent = NULL);
    ~Test() {};

protected:
    void resizeGL(int w, int h);
    void paintEvent(QPaintEvent * event);
    void initializeGL();

};

#endif

Файл Test.cpp:
#include <QtOpenGL>
#include <QPainter>
#include <QPaintEvent>

#include <Test.hpp>

using namespace MPCAM;

Test::Test(QWidget * parent)
    : QGLWidget(QGLFormat(QGL::SampleBuffers), parent)
{
     setAttribute(Qt::WA_NoSystemBackground);
};

void Test::initializeGL()
{
    glClearColor(0.7, 0.0, 0.0, 0.7);
};

void Test::resizeGL(int width, int height)
{
    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1.0, +1.0, +1.0, -1.0, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
}

void Test::paintEvent(QPaintEvent * event)
{
    QPainter painter;
    painter.begin(this);
    painter.setRenderHint(QPainter::Antialiasing);

    glPushAttrib(GL_ALL_ATTRIB_BITS);
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();

    resizeGL(width(), height());

    glEnable(GL_CULL_FACE);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glPopAttrib();
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();

    glDisable(GL_CULL_FACE);
    painter.end();

Файл main.cpp:
#include <QApplication>
#include <Test.hpp>

int main(int argc, char ** argv)
{
    QApplication app(argc, argv);

    Test * test(new Test());

    test->show();

    return app.exec();
};

Sectoid ★★★★★
() автор топика

Проблема решена. Оказалось, что QPainter внутри себя вызывает glClearColor(). Решение: добавить вызов glClearColor() плосле вызова QPainter.begin(this). И вообще состояние текущих настроек OpenGL после вызова QPainter::begin() лучше считать неопределённым, и перед работой произвести инициализацию.

Тема закрыта.

Sectoid ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.