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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt 4.4.1 - глюк при отрисовке полигонов ...  (Прочитано 4878 раз)
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 мне подсказывает мол "надо выложить код который можно собрать и потестить".  Я то надеялся, что кто нибудь сталкивался с подобным.

утрированый пример глюка во вложении:
« Последнее редактирование: Сентябрь 19, 2008, 14:12 от mal » Записан
Alex03
Гость
« Ответ #1 : Сентябрь 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);
« Последнее редактирование: Сентябрь 19, 2008, 16:38 от Alex03 » Записан
mal
Гость
« Ответ #2 : Сентябрь 19, 2008, 14:55 »

Дядя Саша - если ты помнишь тему, которую я поднимал по скорости отрисовки в которой говорилось типа мы рисуем куст?
(Ты то знаешь что я рисую, но сие неважно)

Каждая ветка куста  - это полигон. И у меня их туева хуча этих веток. И этот фрагмент сделан как раз чтобы при редактировании над ветками куста (по MouseMove скажем рисуется линия перекрывающая n-веток) не перерисовывалась куча веток полностью, у которых перекрываются bounding rect'ы.
Вопщем сделал так потому что так надо.
ЗЫ И нех ерничать по поводу кто что использует- задачи у всех разные...
Записан
Alex03
Гость
« Ответ #3 : Сентябрь 19, 2008, 14:59 »

Вот и именно, весь остальной куст нарисовал растром и спи спокойно..
Записан
mal
Гость
« Ответ #4 : Сентябрь 20, 2008, 07:11 »

Инсинуации Александра по поводу использования растра или view-scena обсуждать не будем.   Крутой

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

И все рисуется одинаково - красота.  Улыбающийся
Спасибо Александер.   Подмигивающий
« Последнее редактирование: Сентябрь 20, 2008, 07:44 от mal » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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