QPainter绘图
QPainter是实现在各种绘图设备上绘制基本图形的类。QPainter能绘制点、直线、圆、矩形等各种基本图形,还可以绘制文字和位图,用这些基本图形可以组成任何想要的图形。
QWidget的绘图事件和绘图区
QWidget类有一个事件处理函数paintEvent()
,在组件界面需要重绘时,系统自动运行这个函数。需要在界面上绘图,我们需要在这此事件处理函数中创建一个QPainter对象来获取绘图设备的接口,然后用这个对象来进行绘图
QPainter绘图的特性控制
用QPainter在绘图设备上绘图主要是指用QPainter的接口绘制基本图形,包括点、直线、圆、矩形、多边形、文字等。图形的特点,如线条特性、颜色特性、文字特性是由下面3个类决定。
- QPen类:用于控制线条的宽度、颜色、线性。
- QBrush类:用于设置一个区域的填充特性,包括颜色、填充样式、渐变特性等,还可以采用图片进行材质填充。
- QFont类:设置文字的字体、样式、大小等属性。
QPainter有接口函数用于设置和返回当前使用的工具类对象,如下:
QPen &QPainter::pen()
QBrush &QPainter::brush()
QFont &QPainter::font()
void QPainter::setPen(const QPen &pen)//设置画笔
void QPainter::setBrush(const QBrush &brush)//设置画刷
void QPainter::setFont(const QFont &font)//设置文字
QPen类
QPen用于设置绘图时线条的特性,主要包括线宽、颜色、线性等
QPen类的主要函数如下:
void setColor(const QColor &color)//设置画笔的颜色、线条的颜色
void setWidth(int width)//设置线条的宽度,单位的像素
void setStyle(Qt::PenStyle style)//设置线条的样式
void setCapStyle(Qt::PenCapStyle style)//设置线条端点样式
void setJoinStyle(Qt::PenJoinStyle style)//设置线条连接样式
线条样式
- Qt::SolidLine:实线
- Qt::DashLine:虚线
- Qt::DotLine:点划线
- Qt::NoPen:不绘制线条
除了这几种样式,用户还可以自定义线条样式,自定义线条样式时需要用到函数setDashOffset()
和setDashPattern()
线条端点样式
- Qt::FlatCap:方形的线条端,不覆盖线条端点
- Qt::SquareCap:方形的线条端,覆盖线条端点并延申1/2线宽长度
- Qt::RoundCap:圆角线条端
只有线条比较粗时,线条端点效果才会显现
线条连接样式
- Qt::BevelJoin:连接处是平的
- Qt::RoundJoin:连接处是圆的
- Qt::MiterJoin:连接处是尖的
QBrush类
QBrush是定义绘图时的填充特性,包括填充颜色、填充样式、材质填充时的材质图片等
QBrush类的主要函数如下:
//设置画刷颜色
void setColor(const QColor &color)
//设置画刷填充样式
void setStyle(Qt::BrushStyle style)
//设置一个QPixmap 类型的图片作为画刷的图片,画刷样式自动
//设置为Qt::TexturePattern
void setTexture(const QPixmap &pixmap)
//设置一个QImage 类型的图片作为画刷的图片,画刷样式自动
//设置为Qt::TexturePattern
void setTextureImage(const QImage &image)
枚举类型Qt::BrushStyle的参数如下:
枚举值 | 描述 |
---|---|
Qt::NoBrush | 不填充 |
Qt::SoildPattern | 单一颜色填充 |
Qt::HorPattern | 水平线填充 |
Qt::VerPattern | 垂直线填充 |
Qt::LinearGradientPattern | 线性渐变填充,需要使用QLinearGradient类对象作为画刷 |
Qt::RadialGradientPattern | 辐射渐变填充,需要使用QRadialGradient类对象作为画刷 |
Qt::ConicalGradientPattern | 圆锥性填充,需要使用QConicalGradient类对象作为画刷 |
Qt::TextruePattern | 材质填充 |
Qt::CrossPattern | 网格线填充 |
Qt::BDiagPattern | 斜线填充 |
Qt::Dense6Pattern | 密集点填充 |
QFont类
案例-绘制电池
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
int w=this->width();
int h=this->height();
QRect rect(w/4,h/4,200,100);
QPen pen;
//画笔颜色黑,线条宽度3,实线
pen.setColor(Qt::black);
pen.setWidth(3);
pen.setStyle(Qt::SolidLine);
pen.setCapStyle(Qt::FlatCap);
pen.setJoinStyle(Qt::BevelJoin);
painter.setPen(pen);
QBrush brush;
//填充白色,单一颜色填充
brush.setColor(Qt::white);
brush.setStyle(Qt::SolidPattern);
painter.setBrush(brush);
painter.drawRect(rect);
//绘制电池头
brush.setColor(Qt::black);
painter.setBrush(brush);
rect.setRect(w/4+200,h/4+30,10,40);
painter.drawRect(rect);
//绘制电池柱
pen.setStyle(Qt::NoPen);
brush.setColor(Qt::green);
painter.setBrush(brush);
painter.setPen(pen);
rect.setRect(w/4+5,h/4+5,190,90);
painter.drawRect(rect);
//绘制100%字样
QString powStr="100%";
setFont(QFont("times",24,Qt::black));
QFont font(this->font());
painter.setFont(font);
pen.setStyle(Qt::SolidLine);
painter.setPen(pen);
QFontMetrics textSize(font);
QRect textRect=textSize.boundingRect(powStr);
painter.drawText(w/4+(200-textRect.width())/2,h/4+18+textRect.height(),powStr);
event->accept();
}