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"))); }
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")); }
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; }