Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Система рисования. Печать _ Непонятное поведение при рисовани QPainterPath

Автор: FantasyOr 7.9.2010, 17:16

рисую тень от страницы и страницу поверх тени:

{
QRectF paperRect(300,500, 200,300);
QRectF shadowRect = paperRect;        
shadowRect.translate(50, 40);
        // рисуем тень
QPainterPath shadowPath;
shadowPath.addRect(shadowRect);
QColor shadowColor = QColor(0,0,0,64);
scene->addPath(shadowPath, QPen(shadowColor), QBrush(shadowColor));

        // рисуем страницу
QPainterPath paperPath;            
paperPath.addRect(paperRect);        
scene->addPath(paperPath, QPen(Qt::black), QBrush(Qt::white));
}


если повторить этот код несколько раз(изменив координаты paperRect), то тень отображается выше страницы, причем не во всех случаях, но эффект устойчив.

тут вопрос плевый, для того, кто уже попадал в эту ловушку, мне наверное надо обнулять параметры сцены, но я не могу понять что именно(думал из-за полупрозрачности, но нет). Уже думал тень рисовать как 2 прямоугольника, но это косорукий способ. Подскажите пожалуйста как правильно написать.
Спасибо.

Автор: igor_bogomolov 7.9.2010, 23:24

Цитата(FantasyOr @ 7.9.2010, 18:16) *
рисую тень от страницы и страницу поверх тени:
Взгляни на http://doc.crossplatform.ru/qt/4.6.x/qgraphicseffect.html. http://doc.crossplatform.ru/qt/4.6.x/qgraphicsdropshadoweffect.html

Автор: FantasyOr 8.9.2010, 9:49

справка на английском, примеров не нашел, верней только этот:

QDialog *dialog=new QDialog();
QGraphicsDropShadowEffect *effect=new QGraphicsDropShadowEffect();
dialog->setGraphicsEffect(effect);
dialog->show();


но у QPainterPath нет setGraphicsEffect. то что нет примеров в документации большой минус.

я понял нужно создавать класс и наследоваться от эффекта? если так, то это совсем не кавайно для обычной отрисовки(больше ничего мне с объектом делать не нужно) городить огород и множить классы.

все еще жду помощи
спасибо

а кто занимается переводом справок?

при рытье по теме shadoweffect

Цитата
Аккуратнее с QGraphicsDropShadowEffect. Столкнулся с жуткими тормозами при масштабировании view, завязанную на сцену даже с одним виджетом с QGraphicsDropShadowEffect.
Пробовал даже на примере из поставки Qt (diagramscene) - добавил QGraphicsDropShadowEffect к итемам, чувствуются реальные тормоза
( источник http://www.prog.org.ru/topic_12113_0.html)

по этому вопрос остается открытым, что за глюки по коду описанному вначале?
спасибо.

Автор: igor_bogomolov 8.9.2010, 12:45

Цитата(FantasyOr)
по этому вопрос остается открытым, что за глюки по коду описанному вначале?
У меня глюков не наблюдается. Но для надежности сделай так (задай setZValue)
        QRectF paperRect(300+300*i,500, 200,300);
        QRectF shadowRect = paperRect;
        shadowRect.translate(50, 40);

        // рисуем тень
        QPainterPath shadowPath;
        shadowPath.addRect(shadowRect);
        QColor shadowColor = QColor(0,0,0,64);
        QGraphicsPathItem *shadowItem = scene->addPath(shadowPath, QPen(shadowColor), QBrush(shadowColor));
        shadowItem->setZValue(0);

        // рисуем страницу
        QPainterPath paperPath;
        paperPath.addRect(paperRect);
        QGraphicsPathItem *paperItem = scene->addPath(paperPath, QPen(Qt::black), QBrush(Qt::white));
        paperItem->setZValue(1);



Цитата(FantasyOr)
но у QPainterPath нет setGraphicsEffect. то что нет примеров в документации большой минус.

я понял нужно создавать класс и наследоваться от эффекта? если так, то это совсем не кавайно для обычной отрисовки(больше ничего мне с объектом делать не нужно) городить огород и множить классы.
Нет, тут все гораздо проще. Твой код будет выглядеть так
        // рисуем страницу
        QPainterPath paperPath;
        paperPath.addRect(QRectF(300,500,200,300));
        QGraphicsPathItem *paperItem = scene->addPath(paperPath, QPen(Qt::black), QBrush(Qt::white));
        paperItem->setZValue(1);

        QGraphicsDropShadowEffect *shadowEffect = new QGraphicsDropShadowEffect(ui->graphicsView);
        shadowEffect->setOffset(50,40);
        paperItem->setGraphicsEffect(shadowEffect);


Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)