Qt笔记_11

绘图–2D

基于QPainter、QPaintDevice和QPaintEngine这三个类。

基本绘制与填充

  • QPainter可以在继承自QPainteDevice类的任何对象上进行绘制。
  • QPainter一般在一个部件重绘事件的处理函数中进行绘制,首先要创建QPainter对象,然后进行图形的绘制,最后销毁QPainter对象。
  • 头文件< QPainter >
  • QPen类为QPainter提供了画笔来绘制线条和形状轮廓
  • QBrush类提供了画刷来对图形进行填充,颜色,填充模式。
  • 渐变填充需要QGradient类和QBrush一起指定。有三种方式线性渐变、辐射渐变、锥形渐变。

坐标系统

  • QPainter::scale()函数缩放坐标系统
  • QPainter::rotate()顺时针旋转坐标
  • QPainter::translate()平移坐标系统
  • QPainter::shear()围绕原点扭曲坐标系统
void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawLine(QPoint(0, 0), QPoint(100, 100));
    //创建画笔
    QPen pen(Qt::green, 5, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin);
    //使用画笔
    painter.setPen(pen);
    QRectF rectangle(70.0, 40.0, 80.0, 60.0);
    int startAngle = 30 * 16;
    int spanAngle = 120 * 16;
    //绘制圆弧
    painter.drawArc(rectangle, startAngle, spanAngle);
    //重新设置画笔
    pen.setWidth(1);
    pen.setStyle(Qt::SolidLine);
    painter.setPen(pen);
    //绘制一个矩形
    painter.drawRect(160, 20, 50, 40);
    // 创建画刷
    QBrush brush(QColor(0, 0, 255), Qt::Dense4Pattern);
    // 使用画刷
    painter.setBrush(brush);
    // 绘制椭圆
    painter.drawEllipse(220, 20, 50, 50);
    // 设置纹理
    brush.setTexture(QPixmap("../mydrawing/yafeilinux.png"));
    // 重新使用画刷
    painter.setBrush(brush);
    // 定义四个点
    static const QPointF points[4] = {
        QPointF(270.0, 80.0),
        QPointF(290.0, 10.0),
        QPointF(350.0, 30.0),
        QPointF(390.0, 70.0)
    };
    // 使用四个点绘制多边形
    painter.drawPolygon(points, 4);
    // 使用画刷填充一个矩形区域
    painter.fillRect(QRect(10, 100, 150, 20), QBrush(Qt::darkYellow));
    // 擦除一个矩形区域的内容
    painter.eraseRect(QRect(50, 0, 50, 120));
    // 线性渐变
    QLinearGradient linearGradient(QPointF(40, 190), QPointF(70, 190));
    // 插入颜色
    linearGradient.setColorAt(0, Qt::yellow);
    linearGradient.setColorAt(0.5, Qt::red);
    linearGradient.setColorAt(1, Qt::green);
    // 指定渐变区域以外的区域的扩散方式
    linearGradient.setSpread(QGradient::RepeatSpread);
    // 使用渐变作为画刷
    painter.setBrush(linearGradient);
    painter.drawRect(10, 170, 90, 40);
    // 辐射渐变
    QRadialGradient radialGradient(QPointF(200, 190), 50, QPointF(275, 200));
    radialGradient.setColorAt(0, QColor(255, 255, 100, 150));
    radialGradient.setColorAt(1, QColor(0, 0, 0, 50));
    painter.setBrush(radialGradient);
    painter.drawEllipse(QPointF(200, 190), 50, 50);
    // 锥形渐变
    QConicalGradient conicalGradient(QPointF(350, 190), 60);
    conicalGradient.setColorAt(0.2, Qt::cyan);
    conicalGradient.setColorAt(0.9, Qt::black);
    painter.setBrush(conicalGradient);
    painter.drawEllipse(QPointF(350, 190), 50, 50);
    // 画笔使用线性渐变来绘制直线和文字
    painter.setPen(QPen(linearGradient,2));
    painter.drawLine(0, 280, 100, 280);
    painter.drawText(150, 280, tr("helloQt!"));

}

绘制图像

QImage、QPixmap、QBitmap、QPicture都可以处理图像数据。头文件同名

  • QImage主要用来进行I/O处理,也可以直接访问和操作像素。支持BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM。
    QPainter painter(this);
    QImage image;
    // 加载一张图片
    image.load("../mydrawing3/image.png");
    // 输出图片的一些信息
    qDebug() << image.size() << image.format() << image.depth();
    // 在界面上绘制图片
    painter.drawImage(QPoint(10, 10), image);
    // 获取镜像图片
    QImage mirror = image.mirrored();
    // 将图片进行扭曲
    QTransform transform;
    transform.shear(0.2, 0);
    QImage image2 = mirror.transformed(transform);
    painter.drawImage(QPoint(10, 160), image2);
    // 将镜像图片保存到文件
    image2.save("../mydrawing3/mirror.png");
  • QPixmap用来显示图像。对图像进行缩放时使用函数
  • QBitmap只能用来显示黑白图像,是QPixmap的子类。QPixmap::scaled(),参数为缩放后的大小、宽高比模式、转换模式。
    宽高比模式有3种
    • Qt::KeepAspectRatio保持宽高比,在矩形内显示全部。
    • Qt::IgnoreAspectRatio不保持宽高比,自由缩放。
    • Qt::KeepAspectRatioByExpanding保持宽高比,填满矩形。
QPixmap pix = grab.scaled(label->size(), Qt::KeepAspectRatio,
                                Qt::SmoothTransformation);
    label->setPixmap(pix);
    QPainter painter(this);
    QPixmap pix;
    pix.load("../mydrawing3/yafeilinux.png");
    painter.drawPixmap(0, 0, pix.width(), pix.height(), pix);
    painter.setBrush(QColor(255, 255, 255, 100));
    painter.drawRect(0, 0, pix.width(), pix.height());
  • QPicture记录并重演QPicture命令。
    使用图片格式为 .pic
    记录QPicture命令:
QPicture picture;
QPainter painter;
painter.begin(&picture);
painter.drawEllipse(10,20,80,70);
painter.end();
picture.save("mypicture.pic");

重演QPainter命令:

QPainter picture;
picture.load("mypicture.pic");
QPainter painter;
painter.begin(&myimage);
painter.drawPicture(0,0,picture);
painter.end();

你可能感兴趣的:(Qt)