Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: RomanKravchenko от Февраль 16, 2014, 17:58



Название: Вопрос с тенями к главному окну.
Отправлено: 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);

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


Название: Re: Вопрос с тенями к главному окну.
Отправлено: Fregloin от Февраль 17, 2014, 11:04
Какая ос, какой Qt? На Qt 5 и выше отрисовка идет через OpenGL и поидее эффекты не должны тормозить. Но тут еще такие факторы какая ос, какие дрова стоят и т.п.


Название: Re: Вопрос с тенями к главному окну.
Отправлено: Igors от Февраль 17, 2014, 13:28
На Qt 5 и выше отрисовка идет через OpenGL и поидее эффекты не должны тормозить.
Как бы не наоборот. Эффекты сначала рендерят в QImage - а это уже может быть намного медленнее.

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


Название: Re: Вопрос с тенями к главному окну.
Отправлено: ecspertiza от Февраль 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


Название: Re: Вопрос с тенями к главному окну.
Отправлено: gil9red от Февраль 17, 2014, 18:06
ecspertiza, как раз для моих самописных окон хотел тень ))


Название: Re: Вопрос с тенями к главному окну.
Отправлено: ecspertiza от Февраль 17, 2014, 19:02
gil9red, на здоровье :)