Qt——2D画图

基础画图函数

矩形

painter.drawRect(50,50,200,100);

圆角矩形

painter.drawRoundRect(50,50,200,200,50,50);

xRadius和yRadius分别以矩形宽度和高度的一半的百分比指定,并且应该在0.0到100.0的范围内

弧线

painter.drawArc(50,50,200,200, -90*16, 90*16);

水平向右为0度,顺时针spanAngle为正

startAngle和spanAngle精度为1/16度,

painter.drawChord(350,50,200,200, -90*16, 90*16);

同上,startAngle和spanAngle精度为1/16度,会把弧也画出来

扇形

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()函数绘制路径所描述的图形。

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 填充

即使绘制的路径不是封闭的,也会被视为是隐式关闭的,因此可被填充

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);
}

图形的交、并、补

Qt绘制图形的交、并、补_qt 图形 交点-****博客

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属性,使用的图片背景的透明区域会作为窗口的透明区域,且透明区域不影响对窗口后的物体的操作。这样形状完全可以由美工画图实现

Qt下实现不规则形状窗口显示_qt异形窗口-****博客

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());
}

上一篇:27 OpenCV 凸包


下一篇:最长上升子序列-二、问题简析