Название: Виджет и QGraphicsDropShadowEffect
Отправлено: 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(); }
Название: Re: Виджет и QGraphicsDropShadowEffect
Отправлено: ernie от Января 30, 2012, 09:05
Так же у виджета стоит аттрибут WA_TranslucentBackgroung ,такое ощущение,что проблема в нём,если убираю этот аттрибут,то вроде нормально начинает перерисовываться
Название: Re: Виджет и QGraphicsDropShadowEffect
Отправлено: interv от Января 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()); }
|