基础画图函数
矩形
cpp
painter.drawRect(50,50,200,100);
圆角矩形
cpp
painter.drawRoundRect(50,50,200,200,50,50);
xRadius和yRadius分别以矩形宽度和高度的一半的百分比指定,并且应该在0.0到100.0的范围内
弧线
cpp
painter.drawArc(50,50,200,200, -90*16, 90*16);
水平向右为0度,顺时针spanAngle为正
startAngle和spanAngle精度为1/16度,
弦
cpp
painter.drawChord(350,50,200,200, -90*16, 90*16);
同上,startAngle和spanAngle精度为1/16度,会把弧也画出来
扇形
cpp
painter.drawPie(350,50,200,200, -90*16, 90*16);
路径 QPainterPath 类
QPainterPath 类是一个容器,可把图形形状保存其中,需要时可再次使用,也就是说,复
杂的图形只需要使用路径创建一次,然后就可以调用 QPainter::drawPath()函数多次绘制它
们
步骤 :
1)、创建 QPaiterPath 对象。
2)、使用 moveTo 把当前点移至需要绘制图形的开始位置
3)、使用 lintTo()、arcTo()等函数绘制直线、弧等图形,还可使用 addRect()、addEllipse()
等函数把封闭子路径添加到路径。
4)、使用 QPainter::drawPath()函数绘制路径所描述的图形。
cpp
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPainterPath pa1;
pa1.moveTo(width()/2,height()/2);
pa1.arcTo(0,0,width(),height(), -90, 90);
painter.drawPath(pa1);
}
与上面不同的是 pa1.arcTo(0,0,width(),height(), -90, 90);这里的 startAngle, arcLength精度是1度
QPainterPath 填充
即使绘制的路径不是封闭的,也会被视为是隐式关闭的,因此可被填充
cpp
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QBrush bs(QColor(1,188,1));
painter.setBrush(bs);
QPainterPath pa1;
pa1.moveTo(width()/2,height()/2);
pa1.arcTo(0,0,width(),height(), -90, 90);
painter.drawPath(pa1);
}
图形的交、并、补
cpp
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);//创建画笔
//设置绘制样式
painter.setPen(QPen(QColor(0,255,0,0)));//描边颜色
painter.setBrush(QBrush(Qt::red));//填充颜色(不设置就只是线)
//路径
QPainterPath pa1 ,pa2;
QPolygonF f1,f2;
pa1.addEllipse(100,100,250,250);
pa2.addEllipse(200,200,250,250);
//路径转多边形
f1 = pa1.toFillPolygon();
f2 = pa2.toFillPolygon();
//交并补
QPolygonF un = f1.united(f2);//并
//绘制
painter.drawPolygon(un);
QPainterPath pa3 ,pa4;
QPolygonF f3,f4;
pa3.addEllipse(600,100,250,250);
pa4.addEllipse(700,200,250,250);
//路径转多边形
f3 = pa3.toFillPolygon();
f4 = pa4.toFillPolygon();
QPolygonF su = f3.subtracted(f4);//差
painter.drawPolygon(su);
QPainterPath pa5 ,pa6;
QPolygonF f5,f6;
pa5.addEllipse(1100,100,250,250);
pa6.addEllipse(1200,200,250,250);
//路径转多边形
f5 = pa5.toFillPolygon();
f6 = pa6.toFillPolygon();
QPolygonF in = f5.intersected(f6);//交
//绘制
painter.drawPolygon(in);
}
不规则型形状
通过图形的交并补形成不规则图像虽然是可行的,但是代码上实现起来并不那么容易。如何实现不规则形状?
可通过qt的不规则窗口方法实现在widget中画出不规则图像。通过设置窗口的mask属性,使用的图片背景的透明区域会作为窗口的透明区域,且透明区域不影响对窗口后的物体的操作。这样形状完全可以由美工画图实现
cpp
void MyLL::initWidget()
{
this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);
QPixmap pix;
pix.load(":/photo/ll.png",0,Qt::AvoidDither);
resize(pix.size());
setMask(QBitmap(pix.mask())); //设置透明
//setAttribute(Qt::WA_TranslucentBackground); //去除毛边
}
void MyLL::paintEvent(QPaintEvent *event)
{
//qDebug()<<"event:"<<event;
QPainter painter(this);
painter.drawPixmap(rect(),QPixmap(":/photo/ll.png"),QRect());
QPen pen; //画笔。绘制图形边线,由颜色、宽度、线风格等参数组成
pen.setColor(QColor(255,0,0,255));
QBrush brush; //画刷。填充几何图形的调色板,由颜色和填充风格组成
brush.setColor(QColor(0,255,0,255));
brush.setStyle(Qt::SolidPattern);
//可在QPaintDevice上绘制各种图形。QPaintDevice有之类QWidget、QImage、QOpenGLPaintDevice等
painter.setPen(pen);
painter.setBrush(brush);
painter.drawRect(0,0,this->width(),this->height());
}