需求:
    
    用LABEL作为画板,把纸条缩放到LABEL上,纸条长度不定,宽度固定;
    
    纸条上任意位置画点或者线,点距或者线距不固定,点数和线数也不固定,要成比例映射到LABEL上直观显示
    
    话不多说,上代码:
   
    bool sprayer_Widget::eventFilter(QObject *watched, QEvent
    
     event)
     
     {
     
     
     /
     
      eventfilter和update函數一起配合使用,數據和圖形得以刷新
     
     /
     
     if(watched==ui->lab_work_display && event->type()==QEvent::Paint)
     
     labelPaint();
     
     return QWidget::eventFilter(watched,event);
     
     }
     
     void sprayer_Widget::precal_4painter()
     
     {
     
     
     int Hpix; //胶点的高度(像素为单位)
     
     int tmp_gunno=sprayer_transmit_data.current_gun_number-1; //喷枪下标号
     
     int num_sections=sprayer_transmit_data.top_section[tmp_gunno];
     
     float tmp_len=sprayer_transmit_data.paperlength[tmp_gunno];
     
     qv_paint_data.clear(); //清空用来绘图的数据容器
     
     for(int j=0;j<=num_sections;j++)
     
     {
     
     
     if(tmp_len>0)
     
     {
     
     
     bool tmp_line=sprayer_transmit_data.ifline[j][tmp_gunno];
     
     int tmp_start=sprayer_transmit_data.startpoint[j][tmp_gunno];
     
     int tmp_end=sprayer_transmit_data.endpoint[j][tmp_gunno];
     
     int tmp_points=sprayer_transmit_data.pointnumber[j][tmp_gunno];
     
     /
     
      normal diameter of glue point we assume is 3mm, so ideal Hpix=3
     
     700/paper_length
     
     here 700 is label width in pixel, howerver Hpix is limited to label size
     
     我们假设通常的胶点直径为3毫米, 因此缩放后应该是:HPIX=3*(700/纸张长度).这里700
     
     是标签的像素宽度,但是实际情况是HPIX不能过小,否则就会在屏幕上看不见
    
    /
    
    float tmp_h=2100.0/tmp_len;
    
    float F_width=700.0/tmp_len;//比例的单位是:像素/毫米
   
        if(tmp_h<5)
            Hpix=5;     //if paper_length>420mm,这里规定了HPIX的最小值
        else if(tmp_h>21)
            Hpix=21;    //if paper_length<100mm,这里规定了HPIX的最大值,太大不美观
        else
            Hpix=tmp_h;
        qDebug() << "line 168, Hpix="<<Hpix ;
        if (tmp_line&&tmp_end>0)   //if this section is line and line is existing
        {
            if (Hpix>15) Hpix=15;   //too big line is ugly, make it narrower                
    /
    
     先说特殊情况:如果是喷线,首先像素高度我们设为 Hpix最大为15;喷线给出2组坐标点绘制线:(X1Y1)和
     
     (X2Y2)
    
    /
    
    paint_data.if_paint_line=true;
    
    paint_data.brush_width=Hpix;
    
    int tmp_y=20+Hpix/2;
    
    paint_data.coordinate_x1=tmp_start
    
     F_width;
     
     paint_data.coordinate_x2_w=tmp_end
    
    F_width;
    
    paint_data.coordinate_y1=tmp_y;
    
    paint_data.coordinate_y2_h=tmp_y;
    
    qv_paint_data.push_back(paint_data);
   
            // painter1.drawLine(tmp_start*F_width, tmp_y, tmp_end*F_width, tmp_y); //we draw line
        }
        else if((!tmp_line)&&(tmp_points>0))   //if do dot
        {
            int tmp_gap=sprayer_transmit_data.gluegap[j][tmp_gunno];
            for(int i=0;i<tmp_points;i++)
            {
                qDebug() << "line 181, Hpix="<<Hpix ;
                paint_data.if_paint_line=false;
                paint_data.brush_width=1;
                paint_data.coordinate_x1=(tmp_start+i*tmp_gap)*F_width;//点的横坐标
                paint_data.coordinate_x2_w=Hpix;
                paint_data.coordinate_y1=20;        //点的纵坐标
                paint_data.coordinate_y2_h=Hpix;    //点的高度
                qv_paint_data.push_back(paint_data);
                //                    painter1.drawEllipse((tmp_start+i*tmp_gap)*F_width, 20, Hpix, Hpix);
            }
        }
    }
}
}
    void sprayer_Widget::labelPaint()
    
    {
    
    
    /
    
     总体的绘图思路是这样的:当一把枪的纸张长度,起点终点或者间隔改变的时候,我们要对该枪所有胶段进行重画,
     
     分2步骤:从胶段0开始根据点或者线分别计算出坐标数据,然后利用QT库有函数根据数据画点或者线
    
    /
    
    QPainter painter1(ui->lab_work_display);
    
    painter1.setPen(Qt::white);
    
    painter1.setBrush(QBrush(Qt::white));
   
int tmp_gunno=sprayer_transmit_data.current_gun_number-1;
    tmp_section=sprayer_transmit_data.current_section[tmp_gunno];
    
    int tmp_len=sprayer_transmit_data.paperlength[tmp_gunno];
    
    if(tmp_len>0)
    
    {
    
    
    ui->lab_work_display->setStyleSheet(“background-color: rgb(209, 171, 109)”);
    
    for(int i = 0;i<qv_paint_data.size();i++)
    
    {
    
    
    painter1.setPen(QPen(Qt::white,qv_paint_data.at(i).brush_width));
    
    if(qv_paint_data.at(i).if_paint_line) //if line
    
    {
    
   
            painter1.drawLine(qv_paint_data.at(i).coordinate_x1,
                              qv_paint_data.at(i).coordinate_y1,
                              qv_paint_data.at(i).coordinate_x2_w,
                              qv_paint_data.at(i).coordinate_y2_h); //we draw line
        }
        else
        {
            painter1.drawEllipse(qv_paint_data.at(i).coordinate_x1,
                                 qv_paint_data.at(i).coordinate_y1,
                                 qv_paint_data.at(i).coordinate_x2_w,
                                 qv_paint_data.at(i).coordinate_y2_h);
        }
    }
}
}
 
