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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос с тенями к главному окну.  (Прочитано 4268 раз)
RomanKravchenko
Гость
« : Февраль 16, 2014, 17:58 »

Добрый день!

Постала задача изменить вид главного окна и добавить тень к нему.
Нашел решение:

Код:
    setWindowFlags(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);

    QGraphicsDropShadowEffect *bodyShadow = new QGraphicsDropShadowEffect;
    bodyShadow->setBlurRadius(9.0);
    bodyShadow->setColor(QColor(0, 0, 0, 160));
    bodyShadow->setOffset(4.0);
    ui->centralWidget->setGraphicsEffect(bodyShadow);

Но тут постала большая проблема: отрисовка значительно замедлилась именно после дописывания кода выше, ресайзинг соответсвенно тоже. Можете подсказать, может кто-то сталкивался?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Февраль 17, 2014, 11:04 »

Какая ос, какой Qt? На Qt 5 и выше отрисовка идет через OpenGL и поидее эффекты не должны тормозить. Но тут еще такие факторы какая ос, какие дрова стоят и т.п.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Февраль 17, 2014, 13:28 »

На Qt 5 и выше отрисовка идет через OpenGL и поидее эффекты не должны тормозить.
Как бы не наоборот. Эффекты сначала рендерят в QImage - а это уже может быть намного медленнее.

В таких случаях лучше не упорствовать. Вспомните что задумка была "легкий/изящный эффект", а выходит "источник забот". Также OSX сам бросает тени для окон и как там будут выглядеть "та и эта" - хз. Во всяком случае проблемы с кросс-платформ уже имеете 
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #3 : Февраль 17, 2014, 14:30 »

Для одного своего проекта делал тень вот так

Код:
ShadowWindow::ShadowWindow(QWidget *parent) :
    QWidget(parent)
{
    setAttribute(Qt::WA_TranslucentBackground);

    m_layout = new QVBoxLayout(this);
    m_layout->setContentsMargins(9,9,9,9);
    m_layout->setSpacing(0);

    m_shadowPixmap.load(":/image/resources/image/shadow.png");
}

void ShadowWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawPixmap(0,0,m_shadowPixmap,0,0,14,14);
    painter.drawPixmap(14,0,width() - 28,14,m_shadowPixmap,14,0,1,14);
    painter.drawPixmap(width() - 14,0,m_shadowPixmap,15,0,14,14);

    painter.drawPixmap(0,14,14,height() - 28, m_shadowPixmap, 0, 14,14,1);
    painter.drawPixmap(0,height() - 14,m_shadowPixmap,0,15,14,14);

    painter.drawPixmap(width() - 14,14,14,height() - 28, m_shadowPixmap, 15,14,14,1);
    painter.drawPixmap(width() - 14,height() - 14,m_shadowPixmap,15,15,14,14);

    painter.drawPixmap(14,height() - 14,width() - 28,14, m_shadowPixmap, 15,15,1,14);

    QWidget::paintEvent(event);
}

то есть все окна создаются на базе этого класса, все содержимое помещаем в m_layout. Выглядит примерно так http://joxi.ru/rPIBU_3JTJDObO4i5qQ надеюсь помог.

Чуть не забыл, картинка тени http://joxi.ru/BvMBUxjKTJDmSDUOxYE
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Февраль 17, 2014, 18:06 »

ecspertiza, как раз для моих самописных окон хотел тень ))
Записан

ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #5 : Февраль 17, 2014, 19:02 »

gil9red, на здоровье Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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