天天看点

Qt对QLabel显示的图案使用四条线剪裁图片———附带思路和核心代码

文章目录

  • ​​1 效果​​
  • ​​2 思路​​
  • ​​3 核心代码​​

1 效果

Qt对QLabel显示的图案使用四条线剪裁图片———附带思路和核心代码

2 思路

QLabel一定要设置的和显示的图片一样大小,方便获取相对于QLabel的位置,依次来准确裁剪图片。

给QLabel安装事件过滤器,重写事件过滤事件

3 核心代码

类.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QKeyEvent>
#include<QImage>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private slots:
    void on_pushButton_clicked();

private:
    bool eventFilter(QObject *obj, QEvent *event);//事件过滤器

    //记录现在的鼠标位置
    int nowX;
    int nowY;

    //横线的位置
    int y1Pos = 30;
    //int y2Pos = 34;
    int spacing = 4;//两个横线的间距


    //竖线位置
    int x1Pos = 50;
    int x2Pos = 280;
    //是否需要移动
    bool isMoveY = false;//两个横线一起移动
    bool isMoveX1 = false;
    bool isMoveX2 = false;

    int multiple = 4;//图片变大倍数

    QImage tempTestImg;//暂存图片
    void testImg();//显示图片
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H      
#include "widget.h"
#include "ui_widget.h"

#include<QPixmap>
#include<QImage>
#include<QDebug>
#include<QSize>
#include<QMouseEvent>
#include<QFile>
#include<QKeyEvent>
#include<QPainter>
#include<QPoint>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    testImg();//显示图片
    
    ui->imageLabel->installEventFilter(this);//安装事件过滤器
//    QPainter painter;
//    QImage tempImg = tempTestImg;
//    painter.begin(&tempImg);
//    painter.setPen(QPen(Qt::red, 2, Qt::DashDotLine, Qt::RoundCap));
//   // painter.drawRect(x1, y1, x2 - x1, y2 - y1);
//    painter.drawLine(0, 20, 10, 40);
//    painter.end();
//    ui->imageLabel->setPixmap(QPixmap::fromImage(tempImg));


}

Widget::~Widget()
{
    delete ui;
}
//显示图片
void Widget::testImg(){
      QImage imageData;
      imageData.load("1.png");

     imageData =  imageData.scaled(imageData.width()*multiple, imageData.height()*multiple, Qt::KeepAspectRatio, Qt::SmoothTransformation);
     tempTestImg = imageData;

     QPixmap resImage = QPixmap::fromImage(imageData);

      //resImage.scaled(ui->imageLabel->size(), Qt::IgnoreAspectRatio);
     ui->imageLabel->setScaledContents(true);
      QSize size;
      size.setWidth(resImage.width());
      size.setHeight(resImage.height());
      ui->imageLabel->resize(size);
   // ui->imageLabel->setGeometry(40, 60, resImage.width()*6, resImage.height()*6);

      ui->imageLabel->setPixmap(resImage);

      qDebug()<<"imageLabel:width:"<<ui->imageLabel->width();
      qDebug()<<"imageLabel:height:"<<ui->imageLabel->height();
      qDebug()<<"imageLabel:x:"<<ui->imageLabel->x();
      qDebug()<<"imageLabel:y:"<<ui->imageLabel->y();
      
      QPainter painter;
      QImage tempImg = tempTestImg;
      painter.begin(&tempImg);
      painter.setPen(QPen(Qt::red, 2, Qt::DashDotLine, Qt::RoundCap));//DashDotLine
     // painter.drawRect(x1, y1, x2 - x1, y2 - y1);
      painter.drawLine(0, y1Pos, tempImg.width(), y1Pos);//第一条横线
      painter.drawLine(0, y1Pos + spacing, tempImg.width(), y1Pos + spacing);//第二条横线
      painter.drawLine(x1Pos, 0, x1Pos, tempImg.height());//第一条竖线
      painter.drawLine(x2Pos, 0, x2Pos, tempImg.height());//第一条竖线
      painter.end();
      ui->imageLabel->setPixmap(QPixmap::fromImage(tempImg));

}

//重写事件过滤器
bool Widget::eventFilter(QObject *obj, QEvent *event){
    if(obj == ui->imageLabel){
            if(event->type() == QEvent::MouseButtonPress){
                QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
                if(mouseEvent->button() == Qt::LeftButton){

                     QPoint pos = QCursor::pos();//获得相对于屏幕的坐标
                     //QPoint sPoint1 = mouseEvent->globalPos();//获得相对于屏幕的坐标
                     QPoint pos2 = ui->imageLabel->mapFromGlobal(pos);//获得相对于控件的坐标

                     nowX = pos2.x();
                     nowY = pos2.y();
                     qDebug()<<"鼠标左击x位置:"<<nowX;
                     qDebug()<<"鼠标左击y位置:"<<nowY;

                     if(nowY == y1Pos || nowY == y1Pos + 1 || nowY == y1Pos - 1 ||
                             nowY == y1Pos + spacing -1 || nowY == y1Pos + spacing || nowY == y1Pos + spacing + 1){
                         isMoveY = true;
                     }else if(nowX == x1Pos || nowX == x1Pos - 1 || nowX == x1Pos + 1){
                         isMoveX1 = true;
                     }else if(nowX == x2Pos || nowX == x2Pos - 1 || nowX == x2Pos + 1){
                         isMoveX2 = true;
                     }

                     return  true;
                }else{
                    return false;
                }
            }else if(event->type() == QEvent::MouseMove){
                QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
                if(mouseEvent->buttons() == Qt::LeftButton){
                    if(isMoveY == true){
                        QPoint pos = QCursor::pos();//获得相对于屏幕的坐标
                       //QPoint sPoint1 = mouseEvent->globalPos();//获得相对于屏幕的坐标
                        QPoint pos2 = ui->imageLabel->mapFromGlobal(pos);//获得相对于控件的坐标
                        y1Pos = pos2.y();
                        QPainter painter;
                        QImage tempImg = tempTestImg;
                        painter.begin(&tempImg);
                        painter.setPen(QPen(Qt::red, 2, Qt::DashDotLine, Qt::RoundCap));//DashDotLine
                       // painter.drawRect(x1, y1, x2 - x1, y2 - y1);
                        painter.drawLine(0, y1Pos, tempImg.width(), y1Pos);//第一条横线
                        painter.drawLine(0, y1Pos + spacing , tempImg.width(), y1Pos + spacing );//第二条横线
                        painter.drawLine(x1Pos, 0, x1Pos, tempImg.height());//第一条竖线
                        painter.drawLine(x2Pos, 0, x2Pos, tempImg.height());//第一条竖线
                        painter.end();
                        ui->imageLabel->setPixmap(QPixmap::fromImage(tempImg));

                    }else if(isMoveX1 == true){
                        QPoint pos = QCursor::pos();//获得相对于屏幕的坐标
                       //QPoint sPoint1 = mouseEvent->globalPos();//获得相对于屏幕的坐标
                        QPoint pos2 = ui->imageLabel->mapFromGlobal(pos);//获得相对于控件的坐标
                        x1Pos = pos2.x();
                        QPainter painter;
                        QImage tempImg = tempTestImg;
                        painter.begin(&tempImg);
                        painter.setPen(QPen(Qt::red, 2, Qt::DashDotLine, Qt::RoundCap));//DashDotLine
                       // painter.drawRect(x1, y1, x2 - x1, y2 - y1);
                        painter.drawLine(0, y1Pos, tempImg.width(), y1Pos);//第一条横线
                        painter.drawLine(0, y1Pos + spacing, tempImg.width(), y1Pos + spacing);//第二条横线
                        painter.drawLine(x1Pos, 0, x1Pos, tempImg.height());//第一条竖线
                        painter.drawLine(x2Pos, 0, x2Pos, tempImg.height());//第一条竖线
                        painter.end();
                        ui->imageLabel->setPixmap(QPixmap::fromImage(tempImg));
                    }else if(isMoveX2 == true){
                        QPoint pos = QCursor::pos();//获得相对于屏幕的坐标
                       //QPoint sPoint1 = mouseEvent->globalPos();//获得相对于屏幕的坐标
                        QPoint pos2 = ui->imageLabel->mapFromGlobal(pos);//获得相对于控件的坐标
                        x2Pos = pos2.x();
                        QPainter painter;
                        QImage tempImg = tempTestImg;
                        painter.begin(&tempImg);
                        painter.setPen(QPen(Qt::red, 2, Qt::DashDotLine, Qt::RoundCap));//DashDotLine
                       // painter.drawRect(x1, y1, x2 - x1, y2 - y1);
                        painter.drawLine(0, y1Pos, tempImg.width(), y1Pos);//第一条横线
                        painter.drawLine(0, y1Pos + spacing, tempImg.width(), y1Pos + spacing);//第二条横线
                        painter.drawLine(x1Pos, 0, x1Pos, tempImg.height());//第一条竖线
                        painter.drawLine(x2Pos, 0, x2Pos, tempImg.height());//第一条竖线
                        painter.end();
                        ui->imageLabel->setPixmap(QPixmap::fromImage(tempImg));
                    }
                    return true;

                }else{
                    return false;
                }
            }
            else if(event->type() == QEvent::MouseButtonRelease){
                QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
                if(mouseEvent->button() == Qt::LeftButton){
                    if(isMoveY == true){
                        QPoint pos = QCursor::pos();//获得相对于屏幕的坐标
                       //QPoint sPoint1 = mouseEvent->globalPos();//获得相对于屏幕的坐标
                        QPoint pos2 = ui->imageLabel->mapFromGlobal(pos);//获得相对于控件的坐标
                        y1Pos = pos2.y();
                        QPainter painter;
                        QImage tempImg = tempTestImg;
                        painter.begin(&tempImg);
                        painter.setPen(QPen(Qt::red, 2, Qt::DashDotLine, Qt::RoundCap));//DashDotLine
                       // painter.drawRect(x1, y1, x2 - x1, y2 - y1);
                        painter.drawLine(0, y1Pos, tempImg.width(), y1Pos);//第一条横线
                        painter.drawLine(0, y1Pos + spacing, tempImg.width(), y1Pos + spacing);//第二条横线
                        painter.drawLine(x1Pos, 0, x1Pos, tempImg.height());//第一条竖线
                        painter.drawLine(x2Pos, 0, x2Pos, tempImg.height());//第一条竖线
                        painter.end();
                        ui->imageLabel->setPixmap(QPixmap::fromImage(tempImg));

                        isMoveY = false;
                    }else if(isMoveX1 == true){
                        QPoint pos = QCursor::pos();//获得相对于屏幕的坐标
                       //QPoint sPoint1 = mouseEvent->globalPos();//获得相对于屏幕的坐标
                        QPoint pos2 = ui->imageLabel->mapFromGlobal(pos);//获得相对于控件的坐标
                        x1Pos = pos2.x();
                        QPainter painter;
                        QImage tempImg = tempTestImg;
                        painter.begin(&tempImg);
                        painter.setPen(QPen(Qt::red, 2, Qt::DashDotLine, Qt::RoundCap));//DashDotLine
                       // painter.drawRect(x1, y1, x2 - x1, y2 - y1);
                        painter.drawLine(0, y1Pos, tempImg.width(), y1Pos);//第一条横线
                        painter.drawLine(0, y1Pos + spacing, tempImg.width(), y1Pos + spacing);//第二条横线
                        painter.drawLine(x1Pos, 0, x1Pos, tempImg.height());//第一条竖线
                        painter.drawLine(x2Pos, 0, x2Pos, tempImg.height());//第一条竖线
                        painter.end();
                        ui->imageLabel->setPixmap(QPixmap::fromImage(tempImg));

                        isMoveX1 = false;
                    }else if(isMoveX2 == true){
                        QPoint pos = QCursor::pos();//获得相对于屏幕的坐标
                       //QPoint sPoint1 = mouseEvent->globalPos();//获得相对于屏幕的坐标
                        QPoint pos2 = ui->imageLabel->mapFromGlobal(pos);//获得相对于控件的坐标
                        x2Pos = pos2.x();
                        QPainter painter;
                        QImage tempImg = tempTestImg;
                        painter.begin(&tempImg);
                        painter.setPen(QPen(Qt::red, 2, Qt::DashDotLine, Qt::RoundCap));//DashDotLine
                       // painter.drawRect(x1, y1, x2 - x1, y2 - y1);
                        painter.drawLine(0, y1Pos, tempImg.width(), y1Pos);//第一条横线
                        painter.drawLine(0, y1Pos + spacing, tempImg.width(), y1Pos + spacing);//第二条横线
                        painter.drawLine(x1Pos, 0, x1Pos, tempImg.height());//第一条竖线
                        painter.drawLine(x2Pos, 0, x2Pos, tempImg.height());//第一条竖线
                        painter.end();
                        ui->imageLabel->setPixmap(QPixmap::fromImage(tempImg));

                        isMoveX2 = false;
                    }

                     return true;
                }else{
                    return false;
                }
            }
            else{
                return false;
            }
        }
    else {
                return  QWidget::eventFilter(obj, event);
        }
}
//剪裁button的槽函数
void Widget::on_pushButton_clicked()
{
    qDebug()<<"x1:"<<x1Pos<<"y1:"<<y1Pos<<"width:"<<x2Pos - x1Pos<<"height:"<<4;
    QImage tempImg = tempTestImg.copy(x1Pos, y1Pos, x2Pos - x1Pos, 4);
     ui->imageLabel->resize(tempImg.width(),tempImg.height());
     ui->imageLabel->setScaledContents(true);
     ui->imageLabel->setPixmap(QPixmap::fromImage(tempImg));
     qDebug()<<"宽:"<<tempImg.width()<<"高:"<<tempImg.height();
}