需求:
用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);
}
}
}
}