QLabel一定要设置的和显示的图片一样大小,方便获取相对于QLabel的位置,依次来准确裁剪图片。
给QLabel安装事件过滤器,重写事件过滤事件
类.h
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
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
//.cpp
#include "widget.h"
#include "ui_widget.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
testImg();//显示图片
//下面一行属于博客功能测试(表打我。。。)
[video(video-UtA8d4pa-1591888853573)(type-edu_course)(url-https://edu.csdn.net/course/blogPlay?goods_id=14277&blog_creator=qq_33375598&marketing_id=84)(image-https://img-bss.csdnimg.cn/2020422112656862_91070.png?imageMogr2/auto-orient/thumbnail/400x269!/format/png)(title-150讲轻松搞定Python网络爬虫)]
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();
}