void myGauge1::drawMarkAndText(QPainter* painter) { painter->save(); painter->translate(m_center); int value=0; QString strValue; qreal startAngle=90; qreal increment=(qreal)180/100; for(int i=0;i<=100;i++) { painter->save(); painter->rotate(startAngle); if(i%10==0) { painter->setPen(QColor(16,49,98)); QPointF bottomPot(0,m_colorPieRadius+m_space); QPointF topPot(0,m_colorPieRadius+m_space+m_longHand); painter->drawLine(bottomPot,topPot); strValue=tr("%1").arg(value); qreal textWidth=fontMetrics().width(strValue); qreal textHeight=fontMetrics().height(); QPointF textPot(-textWidth/2,m_colorPieRadius+2*m_space+m_longHand+textHeight); painter->save(); painter->translate(textPot); painter->rotate(180); painter->drawText(QPointF(-textWidth,textHeight/2),strValue); painter->restore(); value+=10; } else if(i%5==0) { painter->setPen(QColor(0,255,17)); QPointF bottomPot(0,m_colorPieRadius+m_space); QPointF topPot(0,m_colorPieRadius+m_space+m_okHand); painter->drawLine(bottomPot,topPot); } else { painter->setPen(QColor(255,170,0)); QPointF bottomPot(0,m_colorPieRadius+m_space); QPointF topPot(0,m_colorPieRadius+m_space+m_shortHand); painter->drawLine(bottomPot,topPot); } startAngle+=increment; painter->restore(); } painter->restore(); }
void CThermoMeterItem::drawMark(QPainter *painter) { painter->save(); qreal initY=m_topSpace; qreal initX=m_markSpace; qreal length=boundingRect().height()-2*m_topSpace; qreal increment=length/100; painter->setPen(m_markClr); // draw vertical line QPointF topPot(m_markSpace,m_topSpace); QPointF bottomPot(m_markSpace,boundingRect().height()-m_topSpace); painter->drawLine(topPot,bottomPot); int vvalue=100; QString strValue; for(int i=0;i<=100;i++) { if(i%10==0) { QPointF leftPot(initX+LONG3,initY); QPointF rightPot(initX,initY); painter->drawLine(leftPot,rightPot); strValue=tr("%1").arg(vvalue); qreal fontWidth=painter->fontMetrics().width(strValue); qreal fontHeight=painter->fontMetrics().height(); QPointF textPot(initX-fontWidth-5,initY+fontHeight/2); painter->drawText(textPot,strValue); vvalue-=10; } else if(i%5==0 && i%10!=0) { QPointF leftPot(initX+OK3,initY); QPointF rightPot(initX,initY); painter->drawLine(leftPot,rightPot); } else { QPointF leftPot(initX+SHORT3,initY); QPointF rightPot(initX,initY); painter->drawLine(leftPot,rightPot); } initY+=increment; } painter->restore(); }
void myGauge2::drawMark(QPainter *painter) { painter->save(); painter->setPen(Qt::white); painter->translate(m_center); qreal dAngle=(qreal)270/100; qreal startAngle=45; int value=0; QString strValue; for(int i=0;i<=100;i++) { painter->save(); painter->rotate(startAngle); if(i%10==0) { strValue=tr("%1").arg(value); qreal textWidth=fontMetrics().width(strValue); qreal textHeight=fontMetrics().height(); QPointF bottomPot(0,m_colorCircleRadius+SPACE1); QPointF topPot(0,m_colorCircleRadius+SPACE1+LONG1); painter->drawLine(bottomPot,topPot); value+=10; painter->save(); QPointF textPot(0-textWidth/2,m_colorCircleRadius+SPACE1+LONG1+SPACE1+textHeight); painter->translate(textPot); painter->rotate(180); painter->drawText(QPointF(-textWidth,textHeight/2),strValue); painter->restore(); } else if(i%5==0) { QPointF bottomPot(0,m_colorCircleRadius+SPACE1); QPointF topPot(0,m_colorCircleRadius+SPACE1+OK1); painter->drawLine(bottomPot,topPot); } else { QPointF bottomPot(0,m_colorCircleRadius+SPACE1); QPointF topPot(0,m_colorCircleRadius+SPACE1+SHORT1); painter->drawLine(bottomPot,topPot); } painter->restore(); startAngle+=dAngle; } painter->restore(); }
void SliderRuler::drawRule(QPainter *painter) { painter->save(); painter->setPen(lineColor); //绘制横向标尺底部线,居中 double initX = space; double initY = (double)height() / 2; lineLeftPot = QPointF(initX, initY); lineRightPot = QPointF(width() - initX, initY); painter->drawLine(lineLeftPot, lineRightPot); //绘制纵向标尺刻度 double length = width() - 2 * space; //计算每一格移动多少 double increment = length / (maxValue - minValue); //根据范围值绘制刻度值及刻度值 for (int i = minValue; i <= maxValue; i = i + shortStep) { if (i % longStep == 0) { QPointF topPot(initX, initY - longLineHeight); QPointF bottomPot(initX, initY); painter->drawLine(topPot, bottomPot); QString strValue = QString("%1").arg((double)i, 0, 'f', precision); double textWidth = fontMetrics().width(strValue); double textHeight = fontMetrics().height(); QPointF textPot(initX - textWidth / 2, initY + textHeight); painter->drawText(textPot, strValue); } else { QPointF topPot(initX, initY - shortLineHeight); QPointF bottomPot(initX, initY); painter->drawLine(topPot, bottomPot); } initX += increment * shortStep; } painter->restore(); }
void DrawProgressBar::drawBarBackground(QPainter* painter) { for (int i = 0; i < iMaxNum; i++) { //绘制灰色圆 painter->save(); painter->setPen(QColor(100,100,100)); painter->setBrush(QColor(100,100,100)); QPointF pot(RECT_WIDTH + i*(iBigRadius + rectWidth), height()/2); painter->drawEllipse(pot, iBigRadius, iBigRadius); painter->restore(); //绘制灰色的矩形-比圆少一个 if (i > 0) { painter->save(); painter->setPen(QColor(100,100,100)); painter->setBrush(QColor(100,100,100)); painter->drawRect(RECT_WIDTH + iBigRadius/2 + (i-1)*(rectWidth + iBigRadius), height()/2 - rectHight/2, rectWidth, rectHight); painter->restore(); } //绘制圆形下的文本-灰色 painter->save(); painter->setPen(QColor(100,100,100)); QFont ft; ft.setPointSize(12); painter->setFont(ft); qreal textWidth = fontMetrics().width(strlist[i]); //qreal textHeight = fontMetrics().height(); QPointF textPot(RECT_WIDTH - iBigRadius/2 - textWidth/2 + i*(rectWidth + iBigRadius), height()/2 + iBigRadius/2 + 35);//iBigRadius/2表示灰色圆半径,35为向下偏移量 painter->drawText(textPot, strlist[i]); painter->restore(); } }
void DrawProgressBar::drawBlueBar(QPainter* painter) { if (m_value > iMaxNum || m_value < 1) { return; } QPointF pt; for (int i = 0; i < m_value; i++) { //绘制蓝色的圆 painter->save(); painter->setPen(QColor(100,185,255)); painter->setBrush(QColor(100,185,255)); pt = QPointF(RECT_WIDTH + i*(rectWidth + iBigRadius), height()/2); painter->drawEllipse(pt, iSmallRadius, iSmallRadius); painter->restore(); //绘制长条-蓝色-比圆少一个 painter->save(); painter->setPen(QColor(100,185,255)); painter->setBrush(QColor(100,185,255)); if (m_value == 1) { painter->drawRect(RECT_WIDTH + iBigRadius/2, height()/2 - rectBlueHight/2, rectWidth/2, rectBlueHight); } if (i > 0) { if (m_value == iMaxNum) { painter->drawRect(RECT_WIDTH + iBigRadius/2 + (i-1)*(rectWidth + iBigRadius), height()/2 - rectBlueHight/2, rectWidth, rectBlueHight); } else { painter->drawRect(RECT_WIDTH + iBigRadius/2 + (i-1)*(rectWidth + iBigRadius), height()/2 - rectBlueHight/2, rectWidth + rectWidth*2/3, rectBlueHight); } } painter->restore(); //绘制圆形下的文本-蓝色 painter->save(); painter->setPen(QColor(100,185,255)); QFont ft; ft.setPointSize(12); painter->setFont(ft); qreal textWidth = fontMetrics().width(strlist[i]); //qreal textHeight = fontMetrics().height(); QPointF textPot(RECT_WIDTH - iBigRadius/2 - textWidth/2 + i*(rectWidth + iBigRadius), height()/2 + iBigRadius/2 + 35);//iBigRadius/2表示灰色圆半径,35为向下偏移量 painter->drawText(textPot, strlist[i]); painter->restore(); //绘制进度条上方的图形及文本 QColor color = QColor(24,189,155); //绘制椭圆 painter->save(); painter->setPen(color); painter->setBrush(color); QRect rect(RECT_WIDTH - 78/2 + (m_value - 1)*(rectWidth + iBigRadius), height()/2 - 60,78,25); painter->drawRoundedRect(rect, 10,10); painter->restore(); //文本 painter->save(); painter->setPen(Qt::white); ft.setPointSize(10); ft.setBold(true); painter->setFont(ft); qreal textWidth2=fontMetrics().width(str_list2[i]); qreal textHeight2=fontMetrics().height(); QPointF textPt(RECT_WIDTH - textWidth2/2 - 1 + (m_value - 1)*(rectWidth + iBigRadius), height()/2 - 60 + 25/2+ textHeight2/2); painter->drawText(textPt, str_list2[i]); painter->restore(); //绘制三角形 painter->save(); painter->setPen(color); painter->setBrush(color); QPointF firstPt(RECT_WIDTH + (m_value - 1)*(rectWidth + iBigRadius) - 10, height()/2 - 60 + 25); QPointF secondPt(RECT_WIDTH + 20 + (m_value - 1)*(rectWidth + iBigRadius) - 10, height()/2 - 60 + 25); QPointF thiirdPt(RECT_WIDTH + 10 + (m_value - 1)*(rectWidth + iBigRadius) - 10, height()/2 - 60 + 25 + 10); QPolygonF polygon; polygon << firstPt << secondPt << thiirdPt; painter->drawPolygon(polygon); painter->restore(); } }