画箭头需要注意:
计算箭头两个线的位置和长度与直线或弧线间的位置关系。
1.画直线箭头
关键代码
const int length = 10;//箭头斜着的投影到线上的长度
QVector<QLineF> lines;
lines.append(QLineF(20,height()/2,width()/2,height()/2));
lines.append(QLineF(width()/2-length,height()/2+length,width()/2,height()/2));
lines.append(QLineF(width()/2-length,height()/2-length,width()/2,height()/2));
QPen pen;
pen.setColor(Qt::blue);
pen.setWidthF(3.5);
painter.setPen(pen);
painter.drawLines(lines);
2.画弧线箭头
关键代码
painter.translate(width()/2,height()/2);
painter.setRenderHint(QPainter::Antialiasing);
const int radius = 150;
const int startAngle = 45;
const int spanAngle = 90;
const float PI = 3.14;
const float ratio = 0.5;
QPen pen;
pen.setWidth(3);
pen.setColor(Qt::red);
pen.setCapStyle(Qt::RoundCap);
painter.setPen(pen);
painter.drawArc(QRectF(-radius,-radius,radius*2,radius*2),startAngle*16,spanAngle*16);
QVector<QLineF> lines;
lines.append(QLineF(radius*cos(startAngle*PI/180),-radius*sin(startAngle*PI/180),radius*cos(startAngle*PI/180)-10,-radius*sin(startAngle*PI/180)));
lines.append(QLineF(radius*cos(startAngle*PI/180),-radius*sin(startAngle*PI/180),radius*cos(startAngle*PI/180),-radius*sin(startAngle*PI/180)-10));
painter.drawLines(lines);
painter.translate(width()/2,height()/2);
painter.setRenderHint(QPainter::Antialiasing);
const int radius = 150;
const int startAngle = 45;
const int spanAngle = 90;
const float PI = 3.14;
const float ratio = 0.5;
QPen pen;
pen.setWidth(3);
pen.setColor(Qt::red);
pen.setCapStyle(Qt::RoundCap);
painter.setPen(pen);
painter.drawArc(QRectF(-radius,-radius,radius*2,radius*2),startAngle*16,spanAngle*16);
QVector<QLineF> lines;
// lines.append(QLineF(radius*cos(startAngle*PI/180),-radius*sin(startAngle*PI/180),radius*cos(startAngle*PI/180)-10,-radius*sin(startAngle*PI/180)));
// lines.append(QLineF(radius*cos(startAngle*PI/180),-radius*sin(startAngle*PI/180),radius*cos(startAngle*PI/180),-radius*sin(startAngle*PI/180)-10));
lines.append(QLineF(radius*cos((startAngle+spanAngle)*PI/180),-radius*sin((startAngle+spanAngle)*PI/180),radius*cos((startAngle+spanAngle)*PI/180)+10,-radius*sin((startAngle+spanAngle)*PI/180)));
lines.append(QLineF(radius*cos((startAngle+spanAngle)*PI/180),-radius*sin((startAngle+spanAngle)*PI/180),radius*cos((startAngle+spanAngle)*PI/180),-radius*sin((startAngle+spanAngle)*PI/180)-10));
painter.drawLines(lines);