Qt——2D画图

基础画图函数

矩形

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

图形的交、并、补

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

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

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

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());
}
相关推荐
thinkMoreAndDoMore24 分钟前
深度学习(3)-TensorFlow入门(常数张量和变量)
开发语言·人工智能·python
追烽少年x43 分钟前
Qt 中的线程池QRunnable和QThreadPool
qt
蓝桉8021 小时前
图片爬取案例
开发语言·数据库·python
逸狼1 小时前
【JavaEE进阶】Spring DI
java·开发语言
my_styles2 小时前
2025-alibaba-Sentinel组件
java·开发语言·sentinel
禁默2 小时前
C++之旅-C++11的深度剖析(1)
开发语言·c++
繁依Fanyi2 小时前
巧妙实现右键菜单功能,提升用户操作体验
开发语言·前端·javascript·vue.js·uni-app·harmonyos
程序员黄同学2 小时前
解释 Vue 中的虚拟 DOM,如何通过 Diff 算法最小化真实 DOM 更新次数?
开发语言·前端·javascript
~kiss~3 小时前
Rust~二刷异步逻辑
开发语言·后端·rust
SomeB1oody3 小时前
【Rust中级教程】2.7. API设计原则之灵活性(flexible) Pt.3:借用 vs. 拥有、`Cow`类型、可失败和阻塞的析构函数及解决办法
开发语言·后端·性能优化·rust