LINUX.ORG.RU

[Qt 4.x.x] QWidget & QGLWidget и полупрозрачность


0

0

Приветствую всех!

И снова я с проблемой полупрозрачности в Qt. Вот такой вот пример кода (см. комментарии). Программа рисует окно, в нём тестовую надпись и 2 полупрозрачных виджета поверх. Всё замечательно, полупрозрачность работает.

А теперь, если изменить во в виджетах родительский класс с QWidget на QGLWidget (т.е. попытаться задействовать OpenGL) получаем полную фигню: прозрачности нет, вместо полупрозрачных виджетов получаем чёрные квадраты малевича.

У кого-нибудь есть какие-то идеи как лечить?...

★★★★★

TestChildWidget.hpp

#ifndef __TEST_CHILD_WIDGET_HPP
#define __TEST_CHILD_WIDGET_HPP

#include <QWidget>

class TestChildWidget : public QWidget
{
    Q_OBJECT
public:
    TestChildWidget(QWidget * parent = NULL);
    ~TestChildWidget() {};
};

#endif

TestChildWidget.cpp

#include <TestChildWidget.hpp>
#include <QPalette>

TestChildWidget::TestChildWidget(QWidget * parent/* = NULL*/)
   : QWidget(parent)
{
    QPalette pal(palette());
    pal.setColor(QPalette::Window, QColor(255, 0, 0, 120));
    setPalette(pal);
    setAutoFillBackground(true);
};

TestWidget.hpp

#ifndef __TEST_WIDGET_HPP
#define __TEST_WIDGET_HPP

#include <QWidget>

class QPaintEvent;
class TestWidget : public QWidget
{
    Q_OBJECT

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

protected:
    void paintEvent(QPaintEvent * event);

};

#endif

TestWidget.cpp

#include <TestWidget.hpp>
#include <QPainter>
#include <QPaintEvent>
#include <QPalette>

TestWidget::TestWidget(QWidget * parent/* = NULL*/)
    : QWidget(parent)
{

    QPalette pal(palette());
    pal.setColor(QPalette::Window, QColor(255, 255, 255, 255));
    setPalette(pal);
    setAutoFillBackground(true);
};

void TestWidget::paintEvent(QPaintEvent * event)
{
    QPainter painter;
    painter.begin(this);
    painter.setRenderHint(QPainter::TextAntialiasing);
    painter.drawText(30, 30, "TEST STRING!!!!");
    painter.end();
};

main.cpp

#include <TestWidget.hpp>
#include <TestChildWidget.hpp>
#include <QApplication>
int main(int argc, char ** argv)
{
    QApplication app(argc, argv);
    TestWidget * parent = new TestWidget();
    TestChildWidget * child = new TestChildWidget(parent);
    TestChildWidget * child2 = new TestChildWidget(parent);
    parent->resize(200, 100);
    child->resize(50, 50);
    child2->resize(50, 50);
    child->move(10, 10);
    child2->move(20, 20);
    parent->show();
    return app.exec();
};

Sectoid ★★★★★
() автор топика
Ответ на: комментарий от Sectoid

насколько я понял QGLWidget это тоже самое что и обычный виджет, только для рендеринга ОпенГЛа? Для прозрачности там нужно включить блендинг и альфатест, как я помню. Поищи, нет ли там чего-то вроде glEnable(GL_BLEND) и glEnable(GL_ALPHA_TEST) в сорцах

lester_dev ★★★★★
()
Ответ на: комментарий от lester_dev

Нет, это я тоже пробовал. Похоже проблема в том, что QGLWidget инкапсулирует в себе контекст OpenGL, а прозрачность между разными контекстами не работаем. И это очень грустно. Но всё равно спасибо.

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