代码:
#ifndef RULERWIDGET_H
#define RULERWIDGET_H
#include <QWidget>
class RulerWidget : public QWidget
{
Q_OBJECT
public:
RulerWidget(Qt::Orientations orientation, QWidget *parent = nullptr);
~RulerWidget()override;
protected:
void paintEvent(QPaintEvent *event)override;
private:
QColor backgroundColor{Qt::white};//背景色
QColor textAndLineColor{"#606060"};//文本和刻度颜色
Qt::Orientations orientation;
QFont font{"微软雅黑",18};
};
#endif // RULERWIDGET_H
#include "rulerwidget.h"
#include <QPainter>
#include <QPaintEvent>
RulerWidget::RulerWidget(Qt::Orientations orientation,QWidget *parent)
: QWidget(parent),
orientation(orientation)
{
orientation == Qt::Horizontal ? setMinimumHeight(100) : setMinimumWidth(100);
}
RulerWidget::~RulerWidget()
{
}
void RulerWidget::paintEvent(QPaintEvent *event)
{
auto rect = event->rect();
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.fillRect(rect,backgroundColor);
//绘制刻度
painter.save();
auto length = (orientation == Qt::Horizontal ? rect.width() : rect.height());
painter.setPen(QPen(textAndLineColor,1));
painter.setFont(font);
if(orientation == Qt::Horizontal)
{
auto height = rect.height();
auto shortLine_y = height * 0.75;
auto longLine_y = height * 0.5;
auto middleLine_y = height * 0.625;
auto halfHeight = height / 2;
int temp = 0;
for(int i = 0;i < length;i+=10)
{
if(temp % 10 == 0)//画长线
{
painter.drawLine(QPointF(i,middleLine_y),QPointF(i,height));
}
else if(temp % 5 == 0)
{
painter.drawLine(QPointF(i,longLine_y),QPointF(i,height));
painter.drawText(QRectF(i-50,0,100,halfHeight),Qt::AlignCenter | Qt::TextWordWrap,QString::number(i));
}
else
{
painter.drawLine(QPointF(i,shortLine_y),QPointF(i,height));
}
++temp;
}
}
else
{
auto width = rect.width();
auto shortLineWidth = width * 0.25;
auto longLineWidth = width * 0.5;
auto middleLineWidth = width * 0.375;
auto harfWidth = width / 2;
int temp = 0;
for(int i = 0;i < length;i+=10)
{
if(temp % 10 == 0)//画长线
{
painter.drawLine(QPointF(middleLineWidth,i),QPointF(0,i));
}
else if(temp % 5 == 0)
{
painter.drawLine(QPointF(longLineWidth,i),QPointF(0,i));
painter.drawText(QRectF(harfWidth,i-50,harfWidth,100),Qt::AlignCenter | Qt::TextWordWrap,QString::number(i));
}
else
{
painter.drawLine(QPointF(shortLineWidth,i),QPointF(0,i));
}
++temp;
}
}
painter.restore();
QWidget::paintEvent(event);
}
使用时在构造函数里指定方向:
RulerWidget w(Qt::Vertical);
RulerWidget w2(Qt::Horizontal);
效果: