QT绘图之自动缩放画线和点

  • Post author:
  • Post category:其他


需求:

用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);

        }
    }
}

}



版权声明:本文为u013841997原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。