Russian Qt Forum
Ноябрь 24, 2024, 21:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Qt 4.x.x] QWidget & QGLWidget  (Прочитано 5022 раз)
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) получаем полную фигню: прозрачности нет, вместо полупрозрачных виджетов получаем чёрные квадраты малевича.

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

Заранее спасибо!
Записан
Dendy
Гость
« Ответ #1 : Январь 17, 2007, 01:29 »

В винде не вьІйдет ничего путного. QGLWidget - обертка над контекстом рисования на окне. А последний будет полностью игнорировать значения полупрозрачности и прочего. ВьІход - рендерить во внеекранньІй буфер (QGLPixelBuffer, QGLFrameBuffer).
Записан
Sectoid
Гость
« Ответ #2 : Январь 17, 2007, 01:36 »

Тестил не в винде, но не важно - Qt ведь должна везде гарантировать одинаковое поведение...

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

Спасибо, за ответ...
Записан
Dendy
Гость
« Ответ #3 : Январь 17, 2007, 02:24 »

Ага, и забить один большой болт на всех пользователей без 3Д ускорителей с корректно установленньІми дровами и поддержкой в последних FrameBuffer, забить на жертвьІ видео памяти, забить на совместимость с не-Qt приложениями/библиотеками, забить на интеграцию с оконной средой, в которой приложение запускается.
Записан
psgenn
Гость
« Ответ #4 : Январь 10, 2010, 11:29 »

Что нибудь с вне экранными буферами получилось?
Записан
developer-nsk
Гость
« Ответ #5 : Февраль 10, 2010, 16:05 »

Блин, у меня такая же проблема, я её описывал тут: http://www.prog.org.ru/topic_11129_0.html
К сожалению, дееспособного ответа так и не получил, или, возможно, не совсем правильно воспользовался советами. В любом случае, мне так и не удалось решить эту проблему, она до сих пор актуальна, и я тоже буду премного благодарен за помощь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 21.