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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Прозрачность окна  (Прочитано 13508 раз)
vunshpunsh
Гость
« : Март 11, 2009, 00:17 »

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

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

Попробуй взять у QGraphicsView обьект QPalete и  определить в ней роль backgroundRole
путем передачи цвета(QColor) c альфа каналом, после чего засунь QPalete обратно в QGraphicsView
Записан
vunshpunsh
Гость
« Ответ #3 : Март 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);
Записан
Sergeich
Гость
« Ответ #4 : Март 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();
}
- все работает (по крайней мере под хренью ).
Записан
Sergeich
Гость
« Ответ #5 : Март 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 виджеты
Записан
vunshpunsh
Гость
« Ответ #6 : Март 25, 2009, 23:13 »

Круто!
Только вот границы сцены видны... От них можно как-то избавиться?
Записан
Sergeich
Гость
« Ответ #7 : Март 26, 2009, 00:47 »

хз.. у мну под хренью с классической темой не видно. Попрбуй либо палитру полностью до транспарента додрочить либо QStyle другой выстави.
Записан
vertuozzo
Гость
« Ответ #8 : Февраль 12, 2010, 16:04 »

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

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Март 11, 2010, 10:10 »

Под стандартными X11 всё это работать не будет, т.к. для не прямоугольных окон нужно использовать XShapeExtension.
Хотя может будет работать, если включить Compiz, но не уверен.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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