Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: vunshpunsh от Март 11, 2009, 00:17



Название: Прозрачность окна
Отправлено: vunshpunsh от Март 11, 2009, 00:17
Доброй ночи!
Наследую класс myClass от QGraphicsView. Добавляю в его конструкторе сцену QGraphicsScene с созданными Item'ами
в мейне делаю:
Код:
myClass my;
my.show();
Хочу чтобы окно, которое появляется было полностью прозрачным, а Item'ы полностью непрозрачными.
Пробовал разные варианты, описанные на форуме: безрезультатно.
Добрые люди, пожалуйста, помогите разобраться!


Название: Re: Прозрачность окна
Отправлено: vunshpunsh от Март 19, 2009, 23:15
Нашел решение, может кому надо....
Промучившись с QGraphic... плюнул и сделал следующее:
Главное окно отнаследовал от QLabel, устанавил ему маску и QPixmap (setMask и setPixmap). QPixmap - png файл с автопрозрачностью (как в примерах книг по QT, где окно делается в виде летающей тарелки).
Взял QPainter и отрисовал движущиеся объекты, используя таймер. Отловил сигналы мышькой покоординатно.
Все это, конечно, долго, но результат желаемый был достигнут. Для пущего понимания можно заглянуть в пример Concentric Circles qtDemo.


Название: Re: Прозрачность окна
Отправлено: xaaw от Март 23, 2009, 22:08
Попробуй взять у QGraphicsView обьект QPalete и  определить в ней роль backgroundRole
путем передачи цвета(QColor) c альфа каналом, после чего засунь QPalete обратно в QGraphicsView


Название: Re: Прозрачность окна
Отправлено: vunshpunsh от Март 24, 2009, 15:13
this - QGraphicsView
Так не работает:
Код:
QPalette p = this->palette();
p.setBrush( this->backgroundRole(), QBrush(QColor(0, 255, 0, 127)) );
this->setAutoFillBackground(false);
this->setPalette( p );

Так тоже:
Код:
this->setStyleSheet("background: transparent");
this->setCacheMode(QGraphicsView::CacheBackground);
QPalette p (this->palette());
p.setBrush(QPalette::Window,Qt::transparent);
this->setPalette(p);
this->setAttribute(Qt::WA_TranslucentBackground);


Название: Re: Прозрачность окна
Отправлено: Sergeich от Март 24, 2009, 23:55
Излагаю свой опыт по данной теме: Если у топ левел виджета поставить атрибут транслюцент и флаг фреймлессхинт, то получится действительно полупрозрачный виджет. Если флаг фреймлессхинт не ставить - то хуй. Например, если модифицировать кутевый екзампл widgets/shapedclock вот таким образом:
Код:
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    ShapedClock clock;
clock.setAttribute(Qt::WA_TranslucentBackground);
clock.setWindowFlags(Qt::FramelessWindowHint);

    clock.show();
    return app.exec();
}
- все работает (по крайней мере под хренью ).


Название: Re: Прозрачность окна
Отправлено: Sergeich от Март 25, 2009, 17:22
Короче, вот изменный main.cpp из Qt/examples/graphicsview/gragdroprobot, там все работает как заказывал:
Код:
#include <QtGui>

#include "coloritem.h"
#include "robot.h"

#include <math.h>

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

    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));

    QGraphicsScene scene(-200, -200, 400, 400);

    for (int i = 0; i < 10; ++i) {
        ColorItem *item = new ColorItem;
        item->setPos(::sin((i * 6.28) / 10.0) * 150,
                     ::cos((i * 6.28) / 10.0) * 150);

        scene.addItem(item);
    }

    Robot *robot = new Robot;
    robot->scale(1.2, 1.2);
    robot->setPos(0, -20);
    scene.addItem(robot);

QPalette palette = app.palette();
palette.setColor( QPalette::Window, Qt::transparent );
palette.setColor( QPalette::Button, Qt::transparent );
palette.setColor( QPalette::Base, Qt::transparent );
palette.setColor( QPalette::Light, Qt::transparent );
palette.setColor( QPalette::Midlight, Qt::transparent );
palette.setColor( QPalette::Dark, Qt::transparent );
palette.setColor( QPalette::Mid, Qt::transparent );
palette.setColor( QPalette::Shadow, Qt::transparent );

    QGraphicsView view(&scene);
view.setPalette(palette);
view.setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
view.setAttribute(Qt::WA_TranslucentBackground);
    view.setRenderHint(QPainter::Antialiasing);
view.setWindowTitle("Drag and Drop Robot");
    view.show();

    return app.exec();
}
Работать это будет только с Qt 4.5, т.к. только там появилась возможность создавать tranclucent виджеты


Название: Re: Прозрачность окна
Отправлено: vunshpunsh от Март 25, 2009, 23:13
Круто!
Только вот границы сцены видны... От них можно как-то избавиться?


Название: Re: Прозрачность окна
Отправлено: Sergeich от Март 26, 2009, 00:47
хз.. у мну под хренью с классической темой не видно. Попрбуй либо палитру полностью до транспарента додрочить либо QStyle другой выстави.


Название: Re: Прозрачность окна
Отправлено: vertuozzo от Февраль 12, 2010, 16:04
Круто!
Только вот границы сцены видны... От них можно как-то избавиться?
Решается следующим образом - после
Код:
QGraphicsView view(&scene);
 добавить
Код:
view.setFrameStyle(QFrame::NoFrame);


Название: Re: Прозрачность окна
Отправлено: GreatSnake от Март 11, 2010, 10:10
Под стандартными X11 всё это работать не будет, т.к. для не прямоугольных окон нужно использовать XShapeExtension.
Хотя может будет работать, если включить Compiz, но не уверен.