Qt03-绘图、设置不规则窗体

一、Qt操作图片

  1. 设置背景图
    新建Widget项目,在.h头文件中定义paintEvent(QPaintEvent *e) 需要导入头文件

    Widget.h
    protected:
        // 重写绘图时间,虚函数
        // 如果在窗口内绘图,必须放在绘图事件里实现
        void paintEvent(QPaintEvent *event);
    
    
    Widget.cpp
    void Widget::paintEvent(QPaintEvent *event){
        // QPainter p(this); 创建的时候直接指定父对象
    
        QPainter p;
        p.begin(this);
    
        // 绘图操作
        // 画背景图, 图片路径不放在Resource下,写绝对路径也可以
        // p.drawPixmap(0, 0, width(), height(), QPixmap("../Image/back.jpg"));
        // rect可以直接获取到当前窗口的大小
        p.drawPixmap(rect(), QPixmap("../Image/back.jpg"));
        p.end();
    }
    
  2. 画笔画线、矩形等等(填充颜色)
    导入头文件QPen 画笔 QBrush 填充颜色 (默认改变窗口大小就会重新进行刷新绘制)

    QPainter p;
     // 定义画笔
    QPen pen;
    pen.setWidth(5);                    // 设置线宽
    // pen.setColor(Qt::red);           // 设置Qt的颜色
    pen.setColor(QColor(3, 212, 200));  // 设置rgb颜色
    pen.setStyle(Qt::DashLine);         // 设置画笔线的类型
    p.setPen(pen);  // 给Painter设置画笔
    
    // 设置画刷
    QBrush brush;
    brush.setColor(Qt::red);            // 设置画刷颜色
    brush.setStyle(Qt::Dense1Pattern);  // 设置画刷格式
    p.setBrush(brush);
    
    // 画直线
    p.drawLine(50, 50, 80, 80);
    p.drawLine(0,0, width(), height());
    
    // 画矩形
    p.drawRect(10,20, 80, 80);
    
    // 画圆, 后边两个参数是上边距和下边距
    p.drawEllipse(QPoint(150, 150), 50, 25);
    
  3. 手动刷新重绘
    在界面中添加按钮点击事件,使用Qt自带 update()方法更新页面

    x = 0;	// 自定义x
    // 添加图片
    p.drawPixmap(x, 180, 80, 80, QPixmap("../Image/player.png"));
    
    
    	void Widget::on_pushButton_clicked()
    {
        x += 20;
        if(x > width()){
            x = 0;
        }
    
        // 刷新窗口
        update();   // 默认刷新整体窗口, 也可以选择刷新指定控件
    }
    
  4. QBitMap和QPixMap
    QBitMap:灰白图片
    QPixMap: 彩色图片

    void PixAndBitMap::paintEvent(QPaintEvent *event){
        QPainter p(this);
        // 背景图片透明的
        p.drawPixmap(0, 0, QPixmap("../Image/fish.png"));
        // 背景不透明的
        p.drawPixmap(300, 0, QBitmap("../Image/fish.png"));
        // p.drawPixmap(200, 0, QPixmap("../Image.player.png"));
    
        // 另外一种文件加载的方法
        QPixmap pixmap;
        pixmap.load("../Image/fish1.png");
        p.drawPixmap(0, 300, pixmap);
    
        QBitmap bitmap;
        bitmap.load("../Image/fish1.png");
        p.drawPixmap(300, 300, bitmap);
    }
    
  5. 其他绘图方式

    • QPixmap:针对屏幕进行优化,和平台相关
    • QImage: 和平台无关,可以对图片进行修改,在线程中绘图
    • QPictrue: 保存绘图的状态(二进制文件)

    QImage.cpp

    void MyQImage::paintEvent(QPaintEvent *event){
    QImage qImage1();    // 创建一个绘图设备
    QImage qImage(400, 300, QImage::Format_ARGB32);    // Format_ARG32背景图是透明色
    
    QPainter p;         // 创建画笔
    p.begin(&qImage);    // 初始化绘图设备
    
    p.drawImage(100, 100, QImage("../Image/fish.png"));
    //p.drawPixmap(100, 100, QImage("../Image/fish.png"));
    
    // 可以对图像的像素点进行操作
    for(int i=0; i<50; i++){
       for(int j=0; j<50; j++){
            // 对绘图设备的前50个像素点进行操作
            qImage.setPixel(i, j, qRgb(0, 255, 0));
        }
    }
    
    p.end();
    
    qImage.save("../Image/QImage.png");
    }
    
    

    Qpicture.cpp

    // 保存图片函数
    QPicture picture;
    QPainter p;
    p.begin(&picture);
    
    p.drawPixmap(0, 0, 80, 80, QPixmap("../Image/fish.png"));
    p.drawLine(50, 50, 150, 150);
    p.end();
    
    picture.save("../Image/Qpicture.png");
    
    // 加载图片函数
    QPicture pic;
    pic.load("../Image/Qpicture.png");
    
    QPainter p(this);
    p.drawPicture(0, 0, pic);
    
  6. QPixmap和QImage转换

    QPainter painter(this);
    
    // QPixMap->QImage
    QPixmap pixmap;
    pixmap.load("../Image/fish.png");
    QImage tempImage = pixmap.toImage();
    painter.drawImage(0, 0, tempImage);
    
    // QImage->QPixMap
    QImage qImage;
    qImage.load("../Image/save.jpg");
    QPixmap temPix = QPixmap::fromImage(qImage);
    painter.drawPixmap(100, 0, temPix)
    

二、不规则窗口

  1. 先去除窗口边框,给窗体中添加入不规则图形
    // 去窗口边框
    setWindowFlags(Qt::FramelessWindowHint | windowFlags());

  2. 设置窗体背景色为透明
    // 窗口背景设置为头透明
    setAttribute(Qt::WA_TranslucentBackground);

  3. 设置鼠标事件(拖拽窗体、关闭、最小化)
    QPoint p; // 用来存储窗体移动的距离
    // 移动窗体
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);

    // 去窗口边框
    setWindowFlags(Qt::FramelessWindowHint | windowFlags());
    // 设置窗体背景色透明
    setAttribute(Qt::WA_TranslucentBackground);
    
    
    void Widget::mousePressEvent(QMouseEvent *event){
        if(event->button() == Qt::RightButton){
            close();    // 右键关闭窗口
        }
        else if(event->button() == Qt::LeftButton){
            // 求坐标差值
            p = event->globalPos() - this->frameGeometry().topLeft();
        }
    }
    
    void Widget::mouseMoveEvent(QMouseEvent *event){
        if(event->buttons() & Qt::LeftButton){
            move(event->globalPos() - p);
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值