11、画图

1、QPainter--->QPaintEngine----->QPaintDevice

  画家    、画图设备:画在哪里;

  重写虚函数 绘图事件 paintEvent();

    如果在窗口绘图,必须放在绘图事件中实现;

    绘图事件会自动调用,窗口需要重新绘制的时候,窗口状态改变

2、虚函数实现

     // 指定画图设备
    //QPainter p(this);  // 指定当前窗口绘图
    QPainter p1;   // 第二种方法
    p1.begin(this);   // 指定当前窗口绘图 与p1.end();结合使用
    
    // 画背景图
    // p1.drawPixmap(0,0,width(),height(),QPixmap("path")); // 画背景图
    //p1.drawPixmap(rect(),Qpixmap("pat"));
    //p1.drawLine();// 画直线
    // 定义画笔
    QPen pen;
    pen.setColor(Qt::red);  // 画笔设置颜色
    pen.setColor(QColor(12,23,45));
    pen.setStyle(Qt::DashLine);  // 设置线性
    pen.setWidth(5);    // 设置线宽
    p1.setPen(pen);     // 画笔交给画家
    
    // 创建画刷对象
    QBrush brush;
    brush.setColor(Qt::red); // 设置画刷颜色
    brush.setStyle();// 设置画刷格式
    
    p1.setBrush(brush);  // 画刷交给画家
    // 画矩形
    //p1.drawRect();
    // 画圆
    //p1.drawEllipse(QPaint(150,150),50,25);

    p1.end();

 3、手动更新绘图事件

  按钮按下,图片向右边移动

// 画图片
    p1.drawPixmap(x,120,80,80,QPixmap("../b7.ico"));
    p1.end();

按钮槽函数

// 按钮槽函数 手动更新绘图事件
void Widget::on_pushButton_clicked()
{
    x += 20;  // 移动图片
    if(x > width())
    {
        x = 0;
    }
    update();  // 更新整个窗口 间接调用paintEvent()
}

4、QBitmap继承于QPixmap

  QBitmap只有两种颜色,黑白;

  QPixmap主要画彩色;

// 画图片 图片背景透明
    p1.drawPixmap(x,120,80,80,QPixmap("../b7.ico"));  // 彩色图片
    p1.drawPixmap(100,0,QBitmap("../b7.ico"));  // 黑白图片
    
    // 图片背景白色
    QBitmap bitmap;
    bitmap.load(""); // 加载图片
     p1.drawPixmap(100,0,bitmap);  // 黑白图片
     // 先加载图片 再花图片
    QPixmap pixmap;
    pixmap.load("");  // 加载图片   图片背景白色
    p1.drawPixmap(x,120,80,80,pixmap);  // 彩色图片

5、绘图设备

  QPixmap:比较常用,经过优化的,与平台有关;不能对像素点修改;

  QImage:与平台无关,可以对图片、像素级修改;可以在线程中绘图;

  QPicture:保存绘图的状态,保存二进制文件

  1、QPixmap

 QPixmap pixmap(400,300);   // 指定绘图设备的大小   绘图设备默认为黑色
    QPainter p(&pixmap);       // 给画家指定绘图设备
    pixmap.fill(Qt::white);    // 绘图设备背景填充为白色
    // 或者画家将绘图设备画成白色
    //p.fillRect(0,0,400,300,QBrush(Qt::white));
    // 画图片
    p.drawPixmap(0,0,80,80,QPixmap("../b7.ico"));
    // 保存图片 可以指定常见的格式
    pixmap.save("../bird.png");

  2、QImage

    // 绘图设备初始化400*300 背景透明QImage::Format_ARGB32
    QImage image(400,300,QImage::Format_ARGB32);
    QPainter p;
    p.begin(&image);   // 指定绘图设备
    p.drawImage(0,0,QImage("../b7.ico"));
    for(int i=0;i<50;i++)
    {
        for(int j=0;j<50;j++)
        {
            // 修改像素点颜色
            image.setPixel(QPoint(i,j),qRgb(0,255,255));
            // 获取像素点
           //  image.pixel(QPoint(i,j));
        }
    }
    p.end();


    // 保存图片 查看图片软件打开
    image.save("../image.png");

  3、QPicture

    // QPicture   // 画图片
    QPicture pic;
    QPainter p;
    p.begin(&pic);
    p.drawPixmap(0,0,QPixmap("../b7.ico"));
    p.drawLine(50,50,150,50);

    p.end();
    pic.save("../pic.png");   // 画图片信息保存到本地

// 读保存的画图信息
void Widget::paintEvent(QPaintEvent *e)
{
    // 读图片
    QPicture pic;
    pic.load("../pic.png");  // 加载图片
    QPainter p(this);
    p.drawPicture(0,0,pic);  // 画图
}

6、QPixmap与QImage之间转换,其余的正常画图

  1、 QPixmap 转为QImage

 // QPixmap转为QImage
    QPixmap pix;
    pix.load("../b7.ico");
    QImage img = pix.toImage();   // QPixmap 转为QImage

 2、将QImage 转为QPixma

QImage imgae;
    imgae.load("../b7.ico");
    QPixmap pmap = QPixmap::fromImage(imgae);  // 将QImage 转为QPixma

 7、不规则窗口

  1、去掉边框

  2、设置窗口背景透明

  3、重写鼠标事件

// 窗口边框设置
// 原来的边框配置与 去除边框相或
    setWindowFlags(Qt::FramelessWindowHint | windowFlags());
    // 窗口背景设置为透明
    setAttribute(Qt::WA_TranslucentBackground);
void Widget::paintEvent(QPaintEvent *e)
{
    QPainter p(this);
    // 绘制图片
    p.drawPixmap(0,0,300,500,QPixmap("../sheep.jpg"));
}
void Widget::mouseMoveEvent(QMouseEvent *e)
{
    if(e->buttons() & Qt::LeftButton)
    {
        move(e->globalPos() - p); // 当前鼠标点击位置 -距离差 图片跟随鼠标一起运动
    }
}
void Widget::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::RightButton)
    {
        close();
    }else{
        // 求坐标差值
        // 当前点击坐标-窗口右上角坐标
        p = e->globalPos() - this->frameGeometry().topLeft();  // 边框的左上角坐标
    }
}

 

posted @ 2020-08-05 18:19  笑不出花的旦旦  阅读(199)  评论(0)    收藏  举报