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

需求:
用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=3700/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="<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_startF_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

你可能感兴趣的:(qt)