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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Виджет и QGraphicsDropShadowEffect  (Прочитано 4142 раз)
ernie
Гость
« : Январь 29, 2012, 08:32 »

Доброго времени суток.

Суть проблемы:
Есть кастомный виджет,с флагами Qt::FramelessWindowHint и Qt::WindowStaysOnTopHint. Виджет может прилепать к краям экрана и в момент прилипания - перерисовывается,в зависимости от края к которому прилип.В paint эвенте идёт отрисовка pixmap и потом этот pixmap уже рисуется на виджете.Проблема в том,что при наложении QGraphicsDropShadowEffect перестаёт правильно перерисовываться пиксмап,т.е. paintEvent вызывается,но в итоге виджет не меняет свой вид,так же в этом случае не работает ресайз(делаю resize(size().width()+10,size().height()+10) , реакции ноль) ,без QGraphicsDropShadowEffect всё проходит корректно.

код:

Код:
void DockArea::paintEvent(QPaintEvent *event)
{
    QPainter p(this);

    QPixmap pm;
    QPixmapCache::find(m_pixmapKey,&pm);
        if (pm.isNull()){
//Здесь идет отрисовка формы виджета
            dockHelper->drawAreaPath(path);

            pm = QPixmap(width(),height());
            pm.fill(Qt::transparent);
            QPainter p(&pm);
            p.setRenderHint(QPainter::Antialiasing);
//Здесь идёт отрисовка самого пиксмапа
            dockHelper->drawPath(&p, path, m_color);

            m_pixmapKey = QPixmapCache::insert(pm);

        }
    p.drawPixmap(0,0,pm);
}

void DockArea::invalidateCache()
{
    QPixmapCache::remove(m_pixmapKey);
}

DockArea::DockArea(....)
{

....
            dropshadow = new QGraphicsDropShadowEffect(this);
            dropshadow->setBlurRadius(20);
            dropshadow->setColor(QColor("#121212"));
            dropshadow->setOffset(0,0);
            setGraphicsEffect(dropshadow);
...
}

void DockArea::mouseMoveEvent(QMouseEvent *event)
{
....
//Здесь идут проверки условий для прилипания/отлипания к границе экрана
....
//если условия выполнены,то выполняем
changeDirection(...);
}

void DockArea::changeDirection(QString direction,bool needCenter)
{
...
//тут всякие внутренние действия
...
updateDock(direction);
}


void DockArea::updateDock(QString direction){
...
//тут устанавливаются параметры
...
    invalidateCache();
    dropshadow->update();
    repaint();
}
Записан
ernie
Гость
« Ответ #1 : Январь 30, 2012, 09:05 »

Так же у виджета стоит аттрибут WA_TranslucentBackgroung ,такое ощущение,что проблема в нём,если убираю этот аттрибут,то вроде нормально начинает перерисовываться
Записан
interv
Гость
« Ответ #2 : Январь 30, 2012, 09:31 »

попробуй добавить на DockArea QLabel и если нада менять картинку то делай это на нем методом setPixmap(...)
мой старый пример, я правда наследовался от QLabel
Код
C
Widget::Widget(QWidget *parent) :
   QLabel(parent)
{
...
 QPixmap img(":/png");
 setPixmap(img);
 setMask(img.mask());
 setAttribute(Qt::WA_TranslucentBackground);
 setWindowFlags(Qt::FramelessWindowHint);
...
}
Кстати попробуй добавить в свой проект
Код
C
void DockArea::paintEvent(QPaintEvent *event)
{
   ...
   p.drawPixmap(0,0,pm);
   setMask(pm.mask());
}
« Последнее редактирование: Январь 30, 2012, 09:40 от interv » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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