示例#1
0
void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.save();
    //fist, draw a rounded rect for header & graphic area;
    painter.drawRoundedRect(header_area,15,15);

    painter.drawRoundedRect(curve_area.x(),curve_area.y(),curve_area.width(),table_area.y()+table_area.height()-curve_area.y(),15,15);
    //painter.drawRoundedRect(curve_area,15,15);

    painter.setPen(Qt::SolidLine);

    QFont Nr_font("Arial",8);
    QPen nom_line_pen(Qt::black, 1.5, Qt::SolidLine);
    QPen act_line_pen(Qt::red, 1.5 ,Qt::SolidLine);
    QPen line_pen(Qt::blue, 1 , Qt::SolidLine);
    QPen tol_line_pen(Qt::green, 1 , Qt::SolidLine);
    //move the painter to the left mid position
    painter.translate(curve_area.x()+gap,curve_area.center().y());

    //draw coordinate axis
    QPen axis_pen(Qt::blue,1,Qt::SolidLine);
    painter.setPen(axis_pen);
    painter.drawLine(0,curve_area.height()/2-10,curve_area.width()-gap*2,curve_area.height()/2-10);
    painter.drawLine(curve_area.width()/2-gap,curve_area.height()/2,curve_area.width()/2-gap,-curve_area.height()/2);
    //draw X axis sign & number
    painter.setFont(Nr_font);
    int be,en;
    be = std::ceil(min_x)+1;
    en = std::floor(max_x)-1;
    for(int i=be;i<=en;++i)
    {
        painter.drawLine((i-min_x)*scale_x,curve_area.height()/2-5,(i-min_x)*scale_x,curve_area.height()/2-15);
        painter.drawText((i-min_x)*scale_x+3,curve_area.height()/2,QString("%1").arg(i));
    }
    //draw Y axis sign & number
    be = std::ceil(min_y*1000);
    en = std::floor(max_y*1000);
    be-=3;
    en+=4;

    //draw 10e-3
    painter.drawText(curve_area.width()/2-gap-20,-curve_area.height()/2+10,
                     10,10,
                     Qt::AlignRight|Qt::AlignVCenter,QString("10"));
    painter.setFont(QFont("Arial",6));
    painter.drawText(curve_area.width()/2-gap-12,-curve_area.height()/2+7,
                     10,10,
                     Qt::AlignRight|Qt::AlignVCenter,QString("-3"));

    for(int i=be;i<=en;i++)
    {
        if (i%2==0)
        {
            painter.drawLine(curve_area.width()/2-gap-5,(double(i)/1000-(min_y+max_y)/2)*scale_y,
                             curve_area.width()/2-gap+5,(double(i)/1000-(min_y+max_y)/2)*scale_y);
            painter.drawText(curve_area.width()/2-gap-15,(double(i)/1000-(min_y+max_y)/2)*scale_y-5,
                             10,10,
                             Qt::AlignRight|Qt::AlignVCenter,QString("%1").arg(i));
        }
        else
        {
            painter.drawLine(curve_area.width()/2-gap-2,(double(i)/1000-(min_y+max_y)/2)*scale_y,
                             curve_area.width()/2-gap+2,(double(i)/1000-(min_y+max_y)/2)*scale_y);
        }
    }
    //draw nominal und actual curves
    painter.setPen(nom_line_pen);
    painter.drawPath(*nom_path);
    painter.setPen(act_line_pen);
    painter.drawPath(*act_path);

    painter.setPen(tol_line_pen);
    painter.drawPath(*ut_path);
    painter.drawPath(*lt_path);

    //painter.drawPoints(nom_points,data->size());

    //draw nominal points as single points
    painter.setPen(line_pen);
    for(int i=0;i<size;++i)
    {
        painter.drawEllipse(nom_points[i],1.2,1.2);
    }
    //draw nominal points number
    for(int i=0;i<28;i++)
    {
        painter.drawLine(nom_points[i],QPointF(nom_points[i].x(),-curve_area.height()/2+50));
        painter.save();
        painter.translate(nom_points[i].x()-2,-curve_area.height()/2+50);
        painter.rotate(-40);
        painter.setFont(Nr_font);
        painter.drawText(0,0,QString("%1").arg(i+1));
        painter.restore();

    }

    //draw profile value
    painter.restore();
    painter.save();
    painter.translate(table_area.center().x(),table_area.y());
    for(int i=0;i<3;++i)
    {
        painter.drawRect(-90+i*60,5,60,20);
    }
    painter.drawArc(-70,10,20,20,0,180*16);
    painter.drawText(-30,5,60,20,Qt::AlignCenter,QString("%1").arg(profil));
    painter.drawText(30,5,60,20,Qt::AlignCenter,QString("%1").arg(QString::number(act_profil,'f',4)));
    //draw data tables
    painter.restore();
    painter.save();

    painter.translate(table_area.x(),table_area.y());

    //set draw paras for the table lines & fonts
    painter.setPen(axis_pen);
    QRectF one_cell(0,0,50,15);
    QRectF title_cell(0,0,80,15);
    QPointF start_pos(60,40);
    QFont word_font("Times New Roman",10);
    QFont num_font("Times New Roman",10);
    num_font.setLetterSpacing(QFont::AbsoluteSpacing,1.5);


    //draw first line table and data
    painter.drawRect(start_pos.x(),start_pos.y(),title_cell.width(),title_cell.height());
    for(int i=1;i<5;++i)
    {
        painter.drawRect(start_pos.x(),start_pos.y()+title_cell.height()*i+5,title_cell.width(),title_cell.height());
    }
    for(int j=1;j<15;++j)
    {
        painter.drawRect(start_pos.x()+title_cell.width()+gap+(j-1)*one_cell.width(),start_pos.y(),one_cell.width(),one_cell.height());
        for(int i=1;i<5;++i)
        {
            painter.drawRect(start_pos.x()+title_cell.width()+gap+(j-1)*one_cell.width(),start_pos.y()+one_cell.height()*i+5,one_cell.width(),one_cell.height());
        }
    }
    //draw text for titles
    painter.setFont(word_font);
    painter.drawText(start_pos.x(),start_pos.y(),title_cell.width(),title_cell.height(),Qt::AlignHCenter|Qt::AlignBottom,
                     QString("number"));
    {
        int i;
        i=1;
        painter.drawText(start_pos.x(),start_pos.y()+title_cell.height()*i+5,title_cell.width(),title_cell.height(),
                         Qt::AlignHCenter|Qt::AlignBottom,QString("X   [mm]"));
        i=2;
        painter.drawText(start_pos.x(),start_pos.y()+title_cell.height()*i+5,title_cell.width(),title_cell.height(),
                         Qt::AlignHCenter|Qt::AlignBottom,QString("Ys  [um]"));
        i=3;
        painter.drawText(start_pos.x(),start_pos.y()+title_cell.height()*i+5,title_cell.width(),title_cell.height(),
                         Qt::AlignHCenter|Qt::AlignBottom,QString("Yi   [um]"));
        i=4;
        painter.drawText(start_pos.x(),start_pos.y()+title_cell.height()*i+5,title_cell.width(),title_cell.height(),
                         Qt::AlignHCenter|Qt::AlignBottom,QString("dev.[um]"));
    }

    //draw the data
    painter.setFont(num_font);
    for (int i=0;i<14;++i)
    {
        painter.drawText(start_pos.x()+title_cell.width()+gap+(i)*one_cell.width(),start_pos.y(),one_cell.width(),one_cell.height(),
                         Qt::AlignHCenter|Qt::AlignBottom,QString("%1").arg(i+1));

        {
            int j=1;
            painter.drawText(start_pos.x()+title_cell.width()+gap+(i)*one_cell.width(),start_pos.y()+one_cell.height()*j+5,
                             one_cell.width()-2,one_cell.height(),
                             Qt::AlignVCenter|Qt::AlignRight,
                             QString("%1").arg(QString::number(nom_data->at(i).x,'f',2)));
            j=2;
            painter.drawText(start_pos.x()+title_cell.width()+gap+(i)*one_cell.width(),start_pos.y()+one_cell.height()*j+5,
                             one_cell.width()-2,one_cell.height(),
                             Qt::AlignVCenter|Qt::AlignRight,
                             QString("%1").arg(QString::number(nom_data->at(i).y*1000,'f',2)));
            j=3;
            painter.drawText(start_pos.x()+title_cell.width()+gap+(i)*one_cell.width(),start_pos.y()+one_cell.height()*j+5,
                             one_cell.width()-2,one_cell.height(),
                             Qt::AlignVCenter|Qt::AlignRight,
                             QString("%1").arg(QString::number(act_data->at(i).y*1000,'f',2)));
            j=4;
            painter.drawText(start_pos.x()+title_cell.width()+gap+(i)*one_cell.width(),start_pos.y()+one_cell.height()*j+5,
                             one_cell.width()-2,one_cell.height(),
                             Qt::AlignVCenter|Qt::AlignRight,
                             QString("%1").arg(QString::number((act_data->at(i).y-nom_data->at(i).y)*1000,'f',2)));

        }

    }
    painter.translate(0,90);
    painter.drawRect(start_pos.x(),start_pos.y(),title_cell.width(),title_cell.height());
    for(int i=1;i<5;++i)
    {
        painter.drawRect(start_pos.x(),start_pos.y()+title_cell.height()*i+5,title_cell.width(),title_cell.height());
    }
    for(int j=1;j<15;++j)
    {
        painter.drawRect(start_pos.x()+title_cell.width()+gap+(j-1)*one_cell.width(),start_pos.y(),one_cell.width(),one_cell.height());
        for(int i=1;i<5;++i)
        {
            painter.drawRect(start_pos.x()+title_cell.width()+gap+(j-1)*one_cell.width(),start_pos.y()+one_cell.height()*i+5,one_cell.width(),one_cell.height());
        }
    }
    //draw text for titles
    painter.setFont(word_font);
    painter.drawText(start_pos.x(),start_pos.y(),title_cell.width(),title_cell.height(),Qt::AlignHCenter|Qt::AlignBottom,
                     QString("number"));
    {
        int i;
        i=1;
        painter.drawText(start_pos.x(),start_pos.y()+title_cell.height()*i+5,title_cell.width(),title_cell.height(),
                         Qt::AlignHCenter|Qt::AlignBottom,QString("X   [mm]"));
        i=2;
        painter.drawText(start_pos.x(),start_pos.y()+title_cell.height()*i+5,title_cell.width(),title_cell.height(),
                         Qt::AlignHCenter|Qt::AlignBottom,QString("Ys  [um]"));
        i=3;
        painter.drawText(start_pos.x(),start_pos.y()+title_cell.height()*i+5,title_cell.width(),title_cell.height(),
                         Qt::AlignHCenter|Qt::AlignBottom,QString("Yi   [um]"));
        i=4;
        painter.drawText(start_pos.x(),start_pos.y()+title_cell.height()*i+5,title_cell.width(),title_cell.height(),
                         Qt::AlignHCenter|Qt::AlignBottom,QString("dev.[um]"));
    }

    //draw the data
    painter.setFont(num_font);
    for (int i=14;i<28;++i)
    {
        painter.drawText(start_pos.x()+title_cell.width()+gap+(i-14)*one_cell.width(),start_pos.y(),one_cell.width(),one_cell.height(),
                         Qt::AlignHCenter|Qt::AlignBottom,QString("%1").arg(i+1));

        {
            int j=1;
            painter.drawText(start_pos.x()+title_cell.width()+gap+(i-14)*one_cell.width(),start_pos.y()+one_cell.height()*j+5,
                             one_cell.width()-2,one_cell.height(),
                             Qt::AlignVCenter|Qt::AlignRight,
                             QString("%1").arg(QString::number(nom_data->at(i).x,'f',2)));
            j=2;
            painter.drawText(start_pos.x()+title_cell.width()+gap+(i-14)*one_cell.width(),start_pos.y()+one_cell.height()*j+5,
                             one_cell.width()-2,one_cell.height(),
                             Qt::AlignVCenter|Qt::AlignRight,
                             QString("%1").arg(QString::number(nom_data->at(i).y*1000,'f',2)));
            j=3;
            painter.drawText(start_pos.x()+title_cell.width()+gap+(i-14)*one_cell.width(),start_pos.y()+one_cell.height()*j+5,
                             one_cell.width()-2,one_cell.height(),
                             Qt::AlignVCenter|Qt::AlignRight,
                             QString("%1").arg(QString::number(act_data->at(i).y*1000,'f',2)));
            j=4;
            painter.drawText(start_pos.x()+title_cell.width()+gap+(i-14)*one_cell.width(),start_pos.y()+one_cell.height()*j+5,
                             one_cell.width()-2,one_cell.height(),
                             Qt::AlignVCenter|Qt::AlignRight,
                             QString("%1").arg(QString::number((act_data->at(i).y-nom_data->at(i).y)*1000,'f',2)));

        }

    }


    //draw a header and LOGO
    painter.restore();
    painter.drawPixmap(header_area.x()+20,header_area.y()+1,header_area.height()-2,header_area.height()-2,*logo);
    painter.translate(header_area.x(),header_area.y());

    QFont header_font("Arial",header_area.height()*3/10,10,true);
    painter.setFont(header_font);
    painter.drawText(0,0,header_area.width(),header_area.height()*6/10,Qt::AlignHCenter|Qt::AlignBottom,QString("PROFILFORM"));
    header_font.setPointSize(header_area.height()*2/10);
    painter.setFont(header_font);
    painter.drawText(0,0,header_area.width(),header_area.height()*9/10,Qt::AlignHCenter|Qt::AlignBottom,QString("ISO 1101"));

    header_font.setItalic(false);
    header_font.setPointSize(9);
    header_font.setFixedPitch(true);
    painter.setFont(header_font);
    painter.drawText(header_area.width()*8/10,header_area.height()*2/10,header_area.width()*2/10,header_area.height()*0.2,
                     Qt::AlignLeft|Qt::AlignVCenter,
                     QString("Inspector  "));
    painter.drawText(header_area.width()*8/10,header_area.height()*4/10,header_area.width()*2/10,header_area.height()*0.2,
                     Qt::AlignLeft|Qt::AlignVCenter,
                     QString("Date  "));
    painter.drawText(header_area.width()*8/10,header_area.height()*6/10,header_area.width()*2/10,header_area.height()*0.2,
                     Qt::AlignLeft|Qt::AlignVCenter,
                     QString("Time "));
    painter.drawText(header_area.width()*9/10,header_area.height()*2/10,header_area.width()*1/10,header_area.height()*0.2,
                     Qt::AlignLeft|Qt::AlignVCenter,
                     QString(":   %1").arg(xml_info->paras.value("operid")));
    painter.drawText(header_area.width()*9/10,header_area.height()*4/10,header_area.width()*1/10,header_area.height()*0.2,
                     Qt::AlignLeft|Qt::AlignVCenter,
                     QString(":   %1").arg(xml_info->paras.value("date")));
    painter.drawText(header_area.width()*9/10,header_area.height()*6/10,header_area.width()*1/10,header_area.height()*0.2,
                     Qt::AlignLeft|Qt::AlignVCenter,
                     QString(":   %1").arg(xml_info->paras.value("time")));
}
示例#2
0
void MainWindow::on_pushButton_clicked()
{

    QFileDialog::Options options;
    options |= QFileDialog::DontUseNativeDialog;
    QString selectedFilter;

    QString fileName = QFileDialog::getSaveFileName(this,
                                                    tr("set the PDF name"),
                                                    "",
                                                    tr("PDF Files (*.pdf)"),
                                                    &selectedFilter,
                                                    options);
    fileName.append(".pdf");
    printer.setOutputFileName(fileName);
    QPainter painter;
    if (! painter.begin(&printer)) { // failed to open file
        qWarning("failed to open file, is it writable?");
        return ;
    }
    painter.save();
    //fist, draw a rounded rect for header & graphic area;
    painter.drawRoundedRect(header_area,15,15);
    painter.drawRoundedRect(curve_area.x(),curve_area.y(),curve_area.width(),table_area.y()+table_area.height(),15,15);
    painter.drawRoundedRect(curve_area,15,15);

    painter.setPen(Qt::SolidLine);

    QPen nom_line_pen(Qt::black, 2, Qt::SolidLine);
    QPen act_line_pen(Qt::blue, 2 ,Qt::SolidLine);

    //move the painter to the left mid position
    painter.translate(curve_area.x(),curve_area.center().y());

    //draw coordinate axis
    QPen axis_pen(Qt::blue,1,Qt::SolidLine);
    painter.setPen(axis_pen);
    painter.drawLine(0,0,curve_area.width(),0);
    painter.drawLine(curve_area.width()/2,curve_area.height()/2,curve_area.width()/2,-curve_area.height()/2);

    //draw nominal und actual curves
    painter.setPen(nom_line_pen);
    painter.drawPath(*nom_path);
    painter.setPen(act_line_pen);
    painter.drawPath(*act_path);
    //painter.drawPoints(nom_points,data->size());

    //draw nominal points as single points
    for(int i=0;i<size;++i)
    {
        painter.drawEllipse(nom_points[i],1.2,1.2);
    }

    //draw data tables
    painter.restore();
    painter.save();
    painter.translate(table_area.x(),table_area.y());
    painter.setFont(QFont("Times New Roman",10));
    for (int i=0;i<14;++i)  //just for test, offical release need auto adjust
    {
        painter.drawText(10+i*60,10,50,150,Qt::AlignCenter,
                         QString("%1\n%2\n%3\n%4")
                            .arg(i+1)
                         .arg(nom_data->at(i).x)
                         .arg(nom_data->at(i).y)
                            .arg( QString::number(act_data->at(i).y,'f',4)));
    }
    painter.translate(0,90);
    for (int i=14;i<28;++i)  //just for test, offical release need auto adjust
    {
        painter.drawText(10+(i-14)*60,10,50,150,Qt::AlignCenter,
                         QString("%1\n%2\n%3\n%4")
                            .arg(i+1)
                         .arg(nom_data->at(i).x)
                         .arg(nom_data->at(i).y)
                         .arg( QString::number(act_data->at(i).y,'f',4)));
    }

    //draw a header and LOGO
    painter.restore();
    painter.drawPixmap(header_area.x()+20,header_area.y()+1,header_area.height()-2,header_area.height()-2,*logo);
    painter.translate(header_area.center().x()-150,header_area.y());        //just for test

    QFont header_font("Blackadder ITC",20);
    painter.setFont(header_font);
    painter.drawText(0,0,300,header_area.height(),Qt::AlignCenter,QString("Just test, Curve Report by Sean"));

}
示例#3
0
QImage Plotter::makePlot()
{
  QImage img=QImage(width,height,QImage::Format_RGB32);
  img.fill(0xffffff);
  QPainter painter(&img);
  painter.setFont(QFont(painter.font().family(),_fs));
  //Отступы
  QFontMetrics metrics(painter.font());
  std::vector<int> lens;
  foreach(QString str,_text_y)
    lens.push_back(str.size());

  float ident_left;
  std::vector<int>::const_iterator it, it2;
  for(int i=0;i<lens.size(); i++)
  {
    it2 = std::max_element(lens.begin(), lens.end());
    if(lens.at(i)==*it2)
    {
      ident_left=metrics.width(_text_y[i])+metrics.width(_text_y[i])/5;
      break;
    }
  }

  float ident_right=metrics.width(_text_x[_text_x.size()-1])+metrics.width(_text_x[_text_x.size()-1])/5;

  //Шаги и отступы снизу и сверху
  float step_x=(width-ident_right-ident_left)/_text_x.size();
  float step_y=height/(_text_y.size()+1);
  float ident_bottom=step_y+_fs;
  float ident_top=step_y+_fs;
  step_y=(height-ident_top-ident_bottom)/(_text_y.size());
  //Оси
  QLineF axis_x(ident_left,height-ident_bottom,width-ident_right,height-ident_bottom);
  QLineF axis_y(ident_left,height-ident_bottom,ident_left,ident_top);

  //Черточки и подписи
  QVector<QLineF> x_hyphen;
  float hx_size=step_x/10;
  float hy_size=step_y/10;
  QList<QRectF> text_x_pos;

  QStringList sl_x = _text_x.split(";",QString::SkipEmptyParts);
  for(int i=0; i<sl_x.size();i++)
  {
    if(i<sl_x.size()-1)
      x_hyphen.append(QLineF(ident_left+(i+1)*step_x,height-ident_bottom-hx_size,ident_left+(i+1)*step_x,height-ident_bottom));

    QFontMetrics metrics(painter.font());

    if(i==sl_x.size()-1)
    {
      text_x_pos.append(QRectF(ident_left+(i+1)*step_x,height-ident_bottom+_fs+hy_size*2,step_x,ident_bottom-_fs-hy_size*2));
      //text_x_pos.append(QRectF(x,y,w,h))
    }
    else
    {
      //text_x_pos.append(QPointF(ident_left+(i+1)*step_x-metrics.width(text_x[i])/2,height-ident_bottom+font+hy_size*2))
      text_x_pos.append(QRectF(ident_left+(i+1)*step_x-metrics.width(sl_x[i])/2,height-ident_bottom+_fs+hy_size*2,step_x,ident_bottom-_fs-hy_size*2));
    }
  }

  QVector<QLineF> y_hyphen;
  QList<QPointF> text_y_pos;
  QStringList sl_y = _text_y.split(";",QString::SkipEmptyParts);
  for(int i=0; i<sl_y.size();i++)
  {
    if(i<sl_y.size()-1)
      y_hyphen.append(QLineF(ident_left,height-ident_bottom-(i+1)*step_y,ident_left+hy_size,height-ident_bottom-(i+1)*step_y));

    QFontMetrics metrics(painter.font());

    if(i==sl_y.size()-1)
      text_y_pos.append(QPointF(ident_left-metrics.width(sl_y[i])/2,ident_top/2+_fs/2));
    else
      text_y_pos.append(QPointF(ident_left-metrics.width(sl_y[i])-hy_size,height-ident_bottom-(i+1)*step_y+_fs/2));
  }

  //Точки графика
  QVector<QPoint> graph_points;
  QVector<QLineF> dot_line_x;
  QVector<QLineF> dot_line_y;

  int dataCount = scriptEngine->evaluate("results.length").toInteger();


  for(int i=0;i<dataCount; i++)
  {
    QScriptValue index = QScriptValue(i);
    scriptEngine->globalObject().setProperty("index",index);
    float curResult = (float)scriptEngine->evaluate("results[index]").toNumber();

    graph_points.append(QPoint(ident_left+step_x*(i+1),height-(ident_bottom+curResult*step_y)));
    dot_line_x.append(QLineF(QPointF(ident_left,graph_points[graph_points.size()-1].y()),graph_points[graph_points.size()-1]));
    dot_line_y.append(QLineF(QPointF(graph_points[graph_points.size()-1].x(),height-ident_bottom),graph_points[graph_points.size()-1]));
  }

  //Перья для рисования
  QPen axis_pen(Qt::black);
  axis_pen.setWidth(4);

  QPen dot_pen(Qt::black);
  dot_pen.setWidth(1);
  dot_pen.setStyle(Qt::DotLine);

  QPen main_pen(Qt::black);
  main_pen.setWidth(2);

  QPen point_pen(Qt::red);
  point_pen.setWidth(4);

  //Рисуем
  //Оси
  painter.setRenderHint(QPainter::Antialiasing);
  painter.setPen(axis_pen);
  painter.drawLine(axis_x);
  painter.drawLine(axis_y);
  //Черточки и подписи
  painter.setPen(main_pen);
  painter.drawLines(x_hyphen);
  painter.drawLines(y_hyphen);
  for(int i=0; i<text_x_pos.size(); i++)
  {
    if(i==text_x_pos.size()-1)
    {
      QFont nf(painter.font());
      nf.setWeight(QFont::Bold);
      painter.setFont(nf);
      painter.drawText(text_x_pos[i],QString(sl_x[i]));
      nf.setWeight(QFont::Normal);
      painter.setFont(nf);
    }
    else
      painter.drawText(text_x_pos[i],Qt::TextWordWrap,QString(sl_x[i]));
  }

  for(int i=0;i<text_y_pos.size();i++)
  {
    if(i==text_y_pos.size()-1)
    {
      QFont nf(painter.font());
      nf.setWeight(QFont::Bold);
      painter.setFont(nf);
      painter.drawText(text_y_pos[i],QString(sl_y[i]));
      nf.setWeight(QFont::Normal);
      painter.setFont(nf);
    }
    else
      painter.drawText(text_y_pos[i],QString(sl_y[i]));
  }
  //График
  QPolygon p(graph_points);
  painter.drawPolyline(p);
  //Пунктирные линии
  painter.setRenderHint(QPainter::Antialiasing,false);
  painter.setPen(dot_pen);
  painter.drawLines(dot_line_x);
  painter.drawLines(dot_line_y);
  //Точки графика
  painter.setRenderHint(QPainter::Antialiasing);
  painter.setPen(point_pen);
  painter.drawPoints(p);
  return img;
}