本着一切皆可painter的原则,绘制一个拖动改变的刻度尺。
首先,鼠标事件中,获取鼠标拖动的坐标。
void StrechRuler::mouseMoveEvent(QMouseEvent *event)
{
if((150 <= event->pos().x()) && (event->pos().x()<= 650)){
curPositionX = event->pos().x()-150;
qDebug()<<"X:"<<event->pos().x();
}
if( (210 <= event->pos().y()) && (event->pos().y() <= 310)){
curPositionY = event->pos().y();
qDebug()<<"Y:"<<event->pos().y();
}
repaint();
}
绘制尺子的具体实现:
void StrechRuler::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.save();
painter.setPen(QPen(QColor(85, 170, 255),1));
painter.setBrush(QBrush(QColor(85, 170, 255)));
painter.drawRect(150,210,curPositionX,100);
painter.restore();
int sScale = 5;
int lScale = 25;
int sScaleCount = curPositionX / sScale + 1;
int lScaleCount = curPositionX / lScale + 1;
painter.setPen(QPen(QColor(255,255,255),1));
for(int i=0; i<sScaleCount; i++){
if(i % 5 != 0){
painter.drawLine(QPoint(150+i*5,210),QPoint(150+i*5,215));
}
}
for(int j=0; j<lScaleCount; j++){
painter.drawLine(QPoint(150+j*25,210),QPoint(150+j*25,225));
}
QFont fontTest("宋体", 6, QFont::Bold,true);
painter.setFont(fontTest);
painter.setPen(QPen(QColor(255,255,255),1));
for(int i = 0; i< lScaleCount; i++){
painter.drawText(QPoint(150+i*25,230),QString::number(i*5));
}
}
注意事项:
- repaint()或者update()非常重要,既然是鼠标拖拽而展示刻度尺,那么要对painter进行及时的刷新。
- 在绝大多数情况下,update()更好,因为它允许Qt来优化速度并且防止闪烁。
- curPositionX / sScale + 1和curPositionX / lScale + 1是为了多画几个刻度,避免尺子展开了而刻度不显示。
- if(i % 5 != 0)是把第5个短刻度取消掉,避免短刻度和长刻度重叠显示。