Как бороться с мерцанием?



  • "Ссылка на картинку...":http://s1.ipicture.ru/uploads/20140516/X1LrUzZ1.png
    Заливаю цветом полигон, при прокрутке залитые области вдруг сильно мерцают. Кто-нибудь сталкивался с такой проблемой и как это убрать?
    P.S. в унаследованном классе от QGraphicsItem  переопределены только 2 метода - paint и boundingRect.



  • Как реализован paint?



  • bq. Как реализован paint?

    @void NewPolygonItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
    {
    /Настройки шрифта и пера/
    QPen pen(QBrush(Qt::black), penWidth);
    painter->setPen(pen);

    //painter->setRenderHint(QPainter::Antialiasing);
    QFont font = widget->font();
    //font.setBold(true);
    font.setPixelSize(14);
    painter->setFont(font);
    
    /*Устанавливаем метрику для обьекта*/
    QFontMetrics metrics(font);
    
    /*устанавливаем флаг для метрики*/
    Qt::TextFlag m_flags = Qt::TextExpandTabs;//TextWordWrap;
    
    /*Создаем header для блока с сообщением, с учетом содержимого заголовка*/
    QSize headerSize = metrics.size(m_flags,m_header,0,0);
    QRectF headerRect(m_bounds.topLeft(),headerSize);
    
    /*Создаем body для блока с сообщением, с учетом его содержимого тела*/       
    QSize bodySize = metrics.size(m_flags,m_body,0,0);
    QRectF bodyRect(headerRect.bottomLeft(),bodySize);//Ставим его "ниже" заголовка
    
    /*Ставим ширину главного блока с сообщением как ширину блока body */
    m_bounds.setWidth(bodyRect.width());
    
    /*Ставим ширину блока header как ширину  блока с сообщением*/
    headerRect.setWidth(bodyRect.width());
    
    /*Пересчитываем главный блок*/
    m_bounds.setHeight(headerRect.height() + bodyRect.height());
    headerRect.setHeight(m_bounds.height()/4);
    bodyRect.setTopLeft(headerRect.bottomLeft());
    m_bounds.setHeight(headerRect.height() + bodyRect.height());
    
    
    /*Создаем полигон на основе нашего блока*/
    m_polygon.append(QPointF(m_bounds.topLeft().x(), m_bounds.topLeft().y()));          //Левый верхний угол
    if(m_transferType == SPF_LOG_IN || m_transferType == SPF_LOG_INFO)                  //Если есть IN или INFO - рисуем стрелку слева
        m_polygon.append(QPointF(m_bounds.topLeft().x() - 20.0, m_bounds.height()/2 + m_y));
    m_polygon.append(QPointF(m_bounds.bottomLeft().x(), m_bounds.bottomLeft().y()));    //Левый нижний угол
    m_polygon.append(QPointF(m_bounds.bottomRight().x(), m_bounds.bottomRight().y()));  //Правый нижний угол
    if(m_transferType == SPF_LOG_OUT || m_transferType == SPF_LOG_INFO)                 //Если есть OUT или INFO - рисуем стрелку слева
        m_polygon.append(QPointF(m_bounds.bottomRight().x() + 20.0, m_bounds.height()/2 + m_y));
    m_polygon.append(QPointF(m_bounds.topRight().x(), m_bounds.topRight().y()));        //Правый верхний угол
    
    
    /*Создаем полигон (исходя из параметров большого полигона) для header'а*/
    m_hpolygon.append(QPointF(headerRect.topLeft().x(), headerRect.topLeft().y()));          //Левый верхний угол
    if(m_transferType == SPF_LOG_IN || m_transferType == SPF_LOG_INFO)                       //Если есть IN или INFO - рисуем стрелку слева
        m_hpolygon.append(QPointF((m_polygon.at(1).x() + headerRect.topLeft().x())/2, (m_polygon.at(1).y()  + headerRect.topLeft().y())/2));
    m_hpolygon.append(QPointF(headerRect.bottomLeft().x(), headerRect.bottomLeft().y()));    //Левый нижний угол
    m_hpolygon.append(QPointF(headerRect.bottomRight().x(), headerRect.bottomRight().y()));  //Правый нижний угол
    if(m_transferType == SPF_LOG_OUT || m_transferType == SPF_LOG_INFO)                      //Если есть OUT или INFO - рисуем стрелку справа
        m_hpolygon.append(QPointF((m_transferType == SPF_LOG_OUT)?(m_polygon.at(3).x() + headerRect.bottomRight().x())/2:(m_polygon.at(4).x() + headerRect.bottomRight().x())/2,
                                  (m_transferType == SPF_LOG_OUT)?(m_polygon.at(3).y() + headerRect.topRight().y())/2:(m_polygon.at(4).y() + headerRect.topRight().y())/2));
    m_hpolygon.append(QPointF(headerRect.topRight().x(), headerRect.topRight().y()));        //Правый верхний угол
    
    
    /*Отрисовка обьектов*/
    //prepareGeometryChange();                                                              //Подготавливает элемент для смены геометрии
    
    //qDebug() << m_coloredType;
    
    //painter->setBrush(m_color);
    //painter->drawPolygon(m_polygon);
    m_shape.addPolygon(m_polygon);
    painter->fillPath (m_shape, m_color);
    painter->drawPath(m_shape);
    //painter->setBrush(Qt::NoBrush);
    painter->drawPolygon(m_hpolygon);                                                   //Рисуем header
    painter->drawText(headerRect, m_header, QTextOption(Qt::AlignCenter));              //Заносим в header текст
    painter->drawText(bodyRect, m_body, QTextOption(Qt::AlignCenter));                  //Заносим в body текст
    /*if(m_existLine == 1)
        painter->drawLine(m_bounds.bottomLeft().x() + m_bounds.width()/2, m_bounds.bottomLeft().y(), m_bounds.bottomLeft().x() + m_bounds.width()/2, m_bounds.bottomLeft().y() + 20.0);*/
    //m_shape.addPolygon(m_polygon);                                              //Заносим оболочку главного блока в путь отрисовки
    //painter->drawPath(m_shape);                                                 //Рисуем путь*
    qDebug() << painter;
    

    }
    @

    P.S. В коде еще остались мои попытки что-то исправить, за них извиняюсь



  • Странно,
    я скопировал ваш код и создал минимальное приложение но никаких тормозов у меня не наблюдается.
    Вы пробовали запускать стандартные примеры с QGraphicsView из Qt, там так же присутствует мерцание?



  • bq. Странно,
    я скопировал ваш код и создал минимальное приложение но никаких тормозов у меня не наблюдается.
    Вы пробовали запускать стандартные примеры с QGraphicsView из Qt, там так же присутствует мерцание?

    Может проблема в QGraphicsView? Просто я генерирую сажем 1 объект, начинаю изменять размер окна QGraphicsView и у меня происходит мерцание, пропажа/появление цвета.

    Стандартный пример из Qt 40000 чипов запускал, там все нормально работает, не могу понять в чем дело.
    П.С. Может я что-то делаю не так? Можно ли посмотреть код вашего приложения? Просто я перенес свой итем класс в пример чипа - так все тормозит и пропадает



  • По ссылке можете найти мой тестовый проект:
    "Проект":http://www.datafilehost.com/d/b1701115

    От вашего отличается минимально.



  • Очень странно.
    Если обявить переменную m_polygon не локальным а членом класса у меня тоже появляется мерцание.

    Пока не понял причину.



  • [quote author="qxoz" date="1401796846"]Очень странно.
    Если обявить переменную m_polygon не локальным а членом класса у меня тоже появляется мерцание.

    Пока не понял причину.[/quote]

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



  • QPolygonF - это QVector
    если он локальный то инициализируется на каждый paint()
    если член класса то его надо обнулять
    я добавил m_polygon.clear(); в CustomItem::paint и оно опять не мерцает.



  • [quote author="andreyc" date="1401797290"]QPolygonF - это QVector
    если он локальный то инициализируется на каждый paint()
    если член класса то его надо обнулять
    я добавил m_polygon.clear(); в CustomItem::paint и оно опять не мерцает.[/quote]
    Хм...действительно, даже как-то в голову не пришло, что раз он в классе, то он самостоятельно не обнуляется.
    Спасибо всем большое за ответы!



  • Спасибо andreyc :)
    Как то не додумался до этого.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.