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());
}
相关推荐
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner1 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz6 天前
QML Hello World 入门示例
qt
xcyxiner9 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner10 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner10 天前
DicomViewer (添加模型类)3
qt
xcyxiner11 天前
DicomViewer (目录调整) 2
qt
xcyxiner11 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00613 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术13 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript