Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Кроссплатформенный C/C++: cl/gcc/Qt/Gtk+/WxWidgets > Qt 5.7.0. Графика с Qpainter


Автор: RiZ 16.10.17, 08:58
Есть основной виджет-экран, на котором расположен слой с диаграммой и параметрами.
Диаграмму (PowerChart ) строит отдельный виджет.

По таймеру в основном виджете вызывается метод AddPoint из PowerChart, передающий новые координаты точки, которые нужно нарисовать
(в примере пока не потаймеру)
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
      PowerChart *pc = new PowerChart(PowerChartType::Plan,0,0,  width(),height(), 1, 1,1, 1, this);
          hlleft->addWidget(pc);
          pc->addPoint(100,100);
          pc->setIsDrawPoint(true);
          pc->addPoint(400,200);
          pc->setIsDrawPoint(true);

Диаграмма рисуется в pixmap, объявлен в заголовке PowerChart.
Рисуется в pixmap, для того чтобы при апдейте PowerChart сохранялось ранее нарисованное и добавлялась новая точка.
Однако, график обновляется каждый раз полностью, рисуется т.о. только последняя добавленная точка.
Что не так делаю?
Если ставить флаг и рисовать drawPixmap в paintEvent единожды, то все равно все перерисовывается
Или это так и должно быть и нужно запоминать все точки в массиве и каждый раз в paintEvent их перерисовывать ?

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    void PowerChart::paintEvent(QPaintEvent *pe){
     
          Q_UNUSED(pe);
          ChartFrame::paintEvent(pe);
          
          QPainter painter;
          painter.begin(this);
          painter.setRenderHint(QPainter::Antialiasing);
     
          QTransform transform;
          transform.translate(3, height()-3);
          transform.rotate(270);
          transform.scale(1.0, 1.0);
          painter.setTransform(transform);
     
         painter.drawPixmap(1,1,width()-6,height()-6,*pixmap);
         painter.end();
        
         if (isDrawPoint) drawPoint();
     
    void PowerChart::drawPoint(){
     
        QPainter p;
     
         p.begin(pixmap);
         p.setPen(QPen(Qt::gray, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
         p.setRenderHint(QPainter::Antialiasing);
     
         p.drawLine(x1,y1,x2,y2);
         p.end();
     
    }



}

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)