Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Sectoid от Январь 16, 2007, 20:43



Название: [Qt 4.x.x] QWidget & QGLWidget
Отправлено: Sectoid от Январь 16, 2007, 20:43
Приветствую всех!

И снова я с проблемой полупрозрачности в Qt. Вот такой вот пример кода:
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
[b]TestWidget.cpp[/b]

Код:

#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();
};


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

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

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

Заранее спасибо!


Название: [Qt 4.x.x] QWidget & QGLWidget
Отправлено: Dendy от Январь 17, 2007, 01:29
В винде не вьІйдет ничего путного. QGLWidget - обертка над контекстом рисования на окне. А последний будет полностью игнорировать значения полупрозрачности и прочего. ВьІход - рендерить во внеекранньІй буфер (QGLPixelBuffer, QGLFrameBuffer).


Название: [Qt 4.x.x] QWidget & QGLWidget
Отправлено: Sectoid от Январь 17, 2007, 01:36
Тестил не в винде, но не важно - Qt ведь должна везде гарантировать одинаковое поведение...

Сие есть очень грустно, но что поделаешь... Интересно, почему тролли не сделали _всю_ прорисовку через OpenGL (обернули бы её в PixelBuffer под капотом библиотеки)?  Было бы и быстрее и возможностей бы добавилось... Эх...

Спасибо, за ответ...


Название: [Qt 4.x.x] QWidget & QGLWidget
Отправлено: Dendy от Январь 17, 2007, 02:24
Ага, и забить один большой болт на всех пользователей без 3Д ускорителей с корректно установленньІми дровами и поддержкой в последних FrameBuffer, забить на жертвьІ видео памяти, забить на совместимость с не-Qt приложениями/библиотеками, забить на интеграцию с оконной средой, в которой приложение запускается.


Название: Re: [Qt 4.x.x] QWidget & QGLWidget
Отправлено: psgenn от Январь 10, 2010, 11:29
Что нибудь с вне экранными буферами получилось?


Название: Re: [Qt 4.x.x] QWidget & QGLWidget
Отправлено: developer-nsk от Февраль 10, 2010, 16:05
Блин, у меня такая же проблема, я её описывал тут: http://www.prog.org.ru/topic_11129_0.html
К сожалению, дееспособного ответа так и не получил, или, возможно, не совсем правильно воспользовался советами. В любом случае, мне так и не удалось решить эту проблему, она до сих пор актуальна, и я тоже буду премного благодарен за помощь.