图形填充QBrush主要功能:
QBrush类定义QPaint绘制的形状的填充图案。
函数原型 | 功能 |
void setColor(QColor &color) | 设置画刷颜色,实体填充时即填充颜色 |
void setStyle(Qt::BrushStyle style) | 设置画刷填充样式,参数为枚举类型Qt::BrushStyle(下图) |
void setTexture(QPixmap &pixmap) | 设置一个QPixmap类型图片作为画刷的图片 |
void setTextureImage(QImage &image) | 设置一个QImage类型图片作为画刷的图片 |
笔刷有样式、颜色、渐变和纹理。
brush style() 使用Qt::BrushStyle枚举定义填充图案。默认笔刷样式是Qt::NoBrush(取决于构造笔刷的方式)。这种风格告诉画家不要填充形状。填充的标准样式是Qt::SolidPattern。使用适当的构造函数创建画笔时可以设置样式,此外,setStyle()函数提供了在构造画笔后更改样式的方法。
不同枚举类型对应的填充效果图:
范例:
void Widget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this); //创建QPainter对象
painter.setRenderHint(QPainter::Antialiasing);//打开图片抗锯齿
painter.setRenderHint(QPainter::TextAntialiasing); //打开文字抗锯齿
int W=this->width(); //绘图区宽度
int H=this->height(); //绘图区高度
QRect rect(W/4,H/4,W/2,H/2); //中间区域举行
//设置画笔
QPen pen;
pen.setWidth(3);
pen.setColor(Qt::red);
pen.setStyle(Qt::SolidLine);
pen.setCapStyle(Qt::FlatCap); //设置端点样式
pen.setJoinStyle(Qt::BevelJoin); //连接样式
painter.setPen(pen);
//1.设置画刷
// QBrush brush;
// brush.setColor(Qt::yellow);
// brush.setStyle(Qt::Dense6Pattern);
// painter.setBrush(brush);
//2.设置线性渐变填充
// QLinearGradient linerGrad(rect.left(),rect.top(),rect.right(),rect.top());
// linerGrad.setColorAt(0,Qt::blue);
// linerGrad.setColorAt(0.5,Qt::white);
// linerGrad.setColorAt(1,Qt::blue);
// painter.setBrush(linerGrad);
//3.设置辐射渐变填充
// QRadialGradient radialGrad(W/2,H/2,qMax(W/3,H/3),W/2,H/2);
// radialGrad.setColorAt(0,Qt::white);
// radialGrad.setColorAt(1,Qt::blue);
// painter.setBrush(radialGrad);
//4.设置圆锥形渐变填充
QConicalGradient conicalGrad(W/2,H/2,45);
conicalGrad.setColorAt(0,Qt::blue);
conicalGrad.setColorAt(1,Qt::white);
painter.setBrush(conicalGrad);
//5. 设置延展填充
QRadialGradient radialGrad(W/2,H/2,qMax(W/8,H/8),W/2,H/2);
radialGrad.setColorAt(0,Qt::white);
radialGrad.setColorAt(1,Qt::blue);
radialGrad.setSpread(QGradient::RepeatSpread);
painter.setBrush(radialGrad);
painter.drawRect(this->rect());//填充更大区域,会有延展效果
//绘图
painter.drawRect(rect);
}
填充效果如下所示:
坐标变换
QPainter有关坐标变换操作的函数:
分组 | 函数原型 | 功能 |
坐标变换 | void translate(qreal dx,qreal dy) void rotate(qreal angle) void scale(qreal sx,qreal sy) void shear(qrael sh,qreal sy) | 坐标系统一定的偏移量,坐标原点平移到新的点 坐标系统顺时针旋转一个角度 坐标系统缩放 坐标系统做扭转变换 |
状态保存与恢复 | void save() void restore() void resetTransform() | 保存painter当前的状态,就是将当前状态压入栈 恢复上一次状态,就是从堆栈中弹出上次的状态 复位所有的坐标变换 |
范例:
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setRenderHint(QPainter::TextAntialiasing);
//生成五角星的五个顶点,假设原点在五角星中心部分
qreal R=100; //半径
const qreal pi=3.14159;
qreal deg=pi*72/180;
QPoint points[5]={QPoint(R,0),
QPoint(R*qCos(deg),-R*qSin(deg)),
QPoint(R*qCos(2*deg),-R*qSin(2*deg)),
QPoint(R*qCos(3*deg),-R*qSin(3*deg)),
QPoint(R*qCos(4*deg),-R*qSin(4*deg)),
};
//设置字体
QFont font;
font.setPointSize(12);
painter.setFont(font);
//设置画笔
QPen pen;
pen.setWidth(3);
pen.setColor(Qt::black);
pen.setStyle(Qt::SolidLine);
pen.setCapStyle(Qt::FlatCap);
pen.setJoinStyle(Qt::BevelJoin);
painter.setPen(pen);
//设置画刷
QBrush brush;
brush.setColor(Qt::yellow);
brush.setStyle(Qt::SolidPattern);
painter.setBrush(brush);
//设计绘制五角星的painterpath,以便重复使用
QPainterPath starpath;
starpath.moveTo(points[0]);
starpath.lineTo(points[2]);
starpath.lineTo(points[4]);
starpath.lineTo(points[1]);
starpath.lineTo(points[3]);
starpath.closeSubpath(); //闭合路径,最后一个点与第一个点相连
//为每个点绑定对应的字体
starpath.addText(points[0],font,"1");
starpath.addText(points[1],font,"2");
starpath.addText(points[2],font,"3");
starpath.addText(points[3],font,"4");
starpath.addText(points[4],font,"5");
//绘图,第一个五角星
painter.save();//保存坐标状态
painter.translate(100,120);
painter.drawPath(starpath);
painter.drawText(0,0,"S1");
painter.restore();//恢复坐标状态
//第二个五角星
painter.translate(300,120);
painter.scale(0.8,0.8);//缩放
painter.rotate(90);//顺时针旋转
painter.drawPath(starpath);
painter.drawText(0,0,"S2");
//第三个五角星
painter.resetTransform();//全部坐标重置为初始坐标
painter.translate(500,120);
painter.rotate(-150);
painter.drawPath(starpath);
painter.drawText(0,0,"S3");
event->accept();
}
运行效果:
视口和窗口
- 视口: 绘图设备的任意一个矩形区域的物理坐标,可以只选取物理坐标的一个矩形区域用于绘图。视口默认情况下等于绘图设备的整个矩形区。
- 窗口: 对应于视口的矩形区域,只不过是用逻辑坐标定义的坐标系,(本例中)窗口坐标的中心在矩形中心。
- 定义视口函数:setViewport();
- 定义窗口函数:setWindow();
范例
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
setPalette(QPalette(Qt::white));//设置画板底色为白色
setAutoFillBackground(true); //自动刷新背景色
this->resize(300,300);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
int w=this->width();
int h=this->height();
int side=qMin(w,h); //取宽度与高度之间的最小值
QRect rect((w-side)/2,(h-side)/2,side,side);
painter.drawRect(rect);
painter.setViewport(rect); //设置视口坐标
painter.setWindow(-100,-100,200,200);//设置窗口坐标系,原点在矩形中间区域
//设置画笔
QPen pen;
pen.setWidth(1);
pen.setStyle(Qt::SolidLine);
pen.setColor(Qt::red);
pen.setCapStyle(Qt::FlatCap);
pen.setJoinStyle(Qt::BevelJoin);
painter.setPen(pen);//设置画笔
//设置线性渐变
QLinearGradient linearGrad(0,0,100,0); //从左到右
linearGrad.setColorAt(0,Qt::yellow);
linearGrad.setColorAt(1,Qt::green);
linearGrad.setSpread(QGradient::PadSpread); //展布模式
painter.setBrush(linearGrad);
//设置组合模式
painter.setCompositionMode(QPainter::CompositionMode_Difference);
// painter.setCompositionMode(QPainter::RasterOp_NotSourceXorDestination);
// painter.setCompositionMode(QPainter::CompositionMode_Exclusion);
for(int i=0;i<36;i++)
{
painter.drawEllipse(QPoint(50,0),50,50);
painter.rotate(10);
}
event->accept();
}
运行效果:
图形视图结构
图形/视图(Graphics View)架构是一种基于图形项(Graphics Item)的模型/视图结构,它主要由三个部分组成,即场景、视图和图形项,它们有各自的坐标系,并且可以互相映射。