Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: mal от Сентябрь 17, 2008, 18:02



Название: Qt 4.4.1 - глюк при отрисовке полигонов ...
Отправлено: mal от Сентябрь 17, 2008, 18:02
QGraphicsVeiw сделаны следующие настройки:
Код:
view->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
view->setResizeAnchor(QGraphicsView::AnchorViewCenter);
view->setRenderHints(QPainter::Antialiasing|QPainter::NonCosmeticDefaultPen);
view->setViewportUpdateMode( QGraphicsView::SmartViewportUpdate );
view->setCacheMode(QGraphicsView::CacheNone);
view->setOptimizationFlag(QGraphicsView::DontAdjustForAntialiasing);

view унаследован от QGrraphicsView и переопределена отрисовка (за ради повышения её скорости )
Код:
void CMyGraphicsView::paintEvent ( QPaintEvent * event )
{
QPaintEvent adjusted = *event;
if(event->region().rects().size() > 10)
{
QRect rect = event->region().boundingRect().adjusted(-1,-1,1,1);
adjusted = QPaintEvent(rect);
}
QGraphicsView::paintEvent(&adjusted);
return;
}
Унаследовал item от QGraphicsPolygonItem и переопределил отрисовку (боремся за скорость отрисовки  :) )
Код:
void CMyPolygonItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
//pen создан в конструкторе item'а
painter->setPen(pen);
painter->setClipRect( option->exposedRect ); // собственно скорость это тут
painter->setRenderHint(QPainter::Antialiasing);
QPainterPath path;
//my_polygon - QPolygonF
path.moveTo(my_polygon.at(0));

       int i=1;
       while (i + 2 < my_polygon.size())
{
//тут Безье куда без него  :)
         path.cubicTo(my_polygon.at(i), my_polygon.at(i+1), my_polygon.at(i+2));
         i += 3;
        }
       while(i < my_polygon.size())
{
           path.lineTo(my_polygon.at(i));
           ++i;
        }
painter->strokePath(path, pen);

return;
}

И глюк вот такой - полки, т.е. горизонтальные линии рисуются очень тонкими, я бы сказал волосяными. Если, утрировано, толщина pen задана 5, то полки рисуются визуально с толщиной пера 1.
Такой эффект проявляется как при маштабе  1:1, так и при увеличении (например  к примеру толщина 10  тогда полки 2 ) :-\
Как с этим побороться?  ???

ЗЫ Такой же глюк имеет место быть и для вертикальных полок (не написал сразу).
тут вот Alex03 мне подсказывает мол "надо выложить код который можно собрать и потестить".  Я то надеялся, что кто нибудь сталкивался с подобным.

утрированый пример глюка во вложении:


Название: Re: Qt 4.4.1 - глюк при отрисовке полигонов ...
Отправлено: Alex03 от Сентябрь 19, 2008, 14:47
Код:
    //pen создан в конструкторе item'а
    painter->setPen(pen);
    painter->setClipRect( option->exposedRect ); // собственно скорость это тут
Дядя Лёша, как ты думаешь откуда берётся exposedRect?
И чё там в коде экстрасенсы сидят, которые догадываются что ты сам и где будешь рисовать, и какой толщиной пера?
Да и в твоём случае когда линии у тя не перекрываются нахрена этот setClipRect() (он всё и обрезает)?
А слабо setPen() сделать сразу для всего CMyPolygonItem() в конструкторе (QAbstractGraphicsShapeItem::setPen())?

Ну и ИМХО не нужен тут GraphicsView, сначала из пушки по воробьям стрелять, а потом со скоростью бороться шайтановыми методами...
А вот это зачем?
Код:
adjusted(-1,-1,1,1);


Название: Re: Qt 4.4.1 - глюк при отрисовке полигонов ...
Отправлено: mal от Сентябрь 19, 2008, 14:55
Дядя Саша - если ты помнишь тему, которую я поднимал по скорости отрисовки в которой говорилось типа мы рисуем куст?
(Ты то знаешь что я рисую, но сие неважно)

Каждая ветка куста  - это полигон. И у меня их туева хуча этих веток. И этот фрагмент сделан как раз чтобы при редактировании над ветками куста (по MouseMove скажем рисуется линия перекрывающая n-веток) не перерисовывалась куча веток полностью, у которых перекрываются bounding rect'ы.
Вопщем сделал так потому что так надо.
ЗЫ И нех ерничать по поводу кто что использует- задачи у всех разные...


Название: Re: Qt 4.4.1 - глюк при отрисовке полигонов ...
Отправлено: Alex03 от Сентябрь 19, 2008, 14:59
Вот и именно, весь остальной куст нарисовал растром и спи спокойно..


Название: Re: Qt 4.4.1 - глюк при отрисовке полигонов ...
Отправлено: mal от Сентябрь 20, 2008, 07:11
Инсинуации Александра по поводу использования растра или view-scena обсуждать не будем.   8)

Тем не менее Александр натолкнул на решение:
В перерисовке полигона делаем: 
Код:
...
QRectF rectf = option->exposedRect;
rectf = rectf.adjusted(-1,-1,1,1);
painter->setClipRect( rectf);
...

И все рисуется одинаково - красота.  :)
Спасибо Александер.   ;)