Доброго времени суток.
Суть проблемы:
Есть кастомный виджет,с флагами 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();
}