1.遇见问题:绘制图形只能绘制到widget上绘制不到label标签的图片上
2.坐标获取不对 获取的是widget像素 并不是label也不是图片的像素
针对第一个问题自定义label控件 提升窗口部件 把鼠标重绘事件重写就行了
第二个问题需要固定好label大小 根据图片缩放比例填充label获取坐标的还是在根据缩放比例还原出来原始坐标系
一下是代码
#ifndef MYLABEL_H
#define MYLABEL_H
#include <QLabel>
#include <QPoint>
#include <QColor>
#include <QPaintEvent>
#include <QImage>
#include <QPixmap>
class myLabel : public QLabel
{
Q_OBJECT
public:
~myLabel();
explicit myLabel(QWidget *parent = nullptr);
//绘制线条
virtual void paintEvent(QPaintEvent *event) override;
//鼠标按下
void mousePressEvent(QMouseEvent *e)override;
//鼠标移动
void mouseMoveEvent(QMouseEvent *e)override;
//鼠标抬起
void mouseReleaseEvent(QMouseEvent *e)override;
//设置所画线条属性
void setLineColor(const QColor lineColor);
void setLineSize(const int lineSize);
//得到画线的起点和终点
QPoint getStartPoint();
QPoint getEndPoint();
void clear();
signals:
void signal_point(QPoint point);
private:
QPoint lineStartPoint; //画线起点
QPoint lineEndPoint; //画线终点
QColor lineColor; //线条颜色
int lineSize; //5种线型
bool isPressed;
};
#endif // MYLABEL_H
#include "myLabel.h"
#include <QPen>
#include<QPainter>
myLabel::myLabel(QWidget *parent) : QLabel(parent) {
setMouseTracking(true);//设置鼠标追踪状态
this->lineStartPoint = QPoint(0,0);
this->lineEndPoint = QPoint(0,0);
this->lineColor = QColor(Qt::black);
this->lineSize = 3;
}
myLabel::~myLabel(){}
//绘制线条
void myLabel::paintEvent(QPaintEvent *event)
{
QLabel::paintEvent(event);//必须有,才能让背景图片显示出来
QPainter painter(this);
QPen pen;
pen.setColor(lineColor);
pen.setWidth(lineSize);
painter.setPen(pen);
painter.drawRect(lineStartPoint.x(), lineStartPoint.y(), lineEndPoint.x() - lineStartPoint.x(), lineEndPoint.y() - lineStartPoint.y());
}
//鼠标按下
void myLabel::mousePressEvent(QMouseEvent *e)
{
lineStartPoint = e->pos();
lineEndPoint = e->pos();
//在图片上绘制
isPressed = true;
}
//鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent *e)
{
if(isPressed)
{
lineEndPoint=e->pos();
emit signal_point(lineEndPoint);
update();
}
}
//鼠标抬起
void myLabel::mouseReleaseEvent(QMouseEvent *e)
{
isPressed=false;
update();
}
void myLabel::setLineColor(const QColor lineColor)
{
this->lineColor = lineColor;
}
void myLabel::setLineSize(const int lineSize)
{
this->lineSize = lineSize;
}
QPoint myLabel::getStartPoint()
{
return lineStartPoint;
}
QPoint myLabel::getEndPoint()
{
return lineEndPoint;
}
void myLabel::clear()
{
lineStartPoint = QPoint(0,0);
lineEndPoint = QPoint(0,0);
update();
}
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QtGlobal>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->label,&myLabel::signal_point,this,&Widget::getLabelPoint);
}
Widget::~Widget()
{
delete ui;
}
void Widget::getLabelPoint(QPoint point)
{
QPointF originalCoordinate = convertToOriginalCoordinates(point, 1/scaleRatio);
QString str = QString("(x:%1,y:%2)").arg(originalCoordinate.x()).arg(originalCoordinate.y());
ui->lineEdit_3->setText(str);
}
// 计算缩小比例的函数
double Widget::calculateScaleRatio(const QImage& originalImage, const QSize& targetSize)
{
// 原始图像宽度和高度
int originalWidth = originalImage.width();
int originalHeight = originalImage.height();
// 目标宽度和高度
int targetWidth = targetSize.width();
int targetHeight = targetSize.height();
// 计算宽度和高度的缩小比例
double widthRatio = static_cast<double>(targetWidth) / originalWidth;
double heightRatio = static_cast<double>(targetHeight) / originalHeight;
// 返回较小的缩小比例
return qMin(widthRatio, heightRatio);
}
QPointF Widget::convertToOriginalCoordinates(const QPointF &scaledCoordinate, double scaleFactor)
{
// 注意:scaleFactor 是缩放比例的倒数
return QPointF(scaledCoordinate.x() * scaleFactor, scaledCoordinate.y() * scaleFactor);
}
void Widget::on_pushButton_clicked()//图片展示
{
QImage image("D:/IMG_3315.jpeg"); // 替换为你的图像路径
QSize targetSize(1258, 675); // 假设目标尺寸是100x100
scaleRatio = calculateScaleRatio(image, targetSize);
qDebug() << "Scale ratio:" << scaleRatio;
// 缩小图像
QImage scaledImage = image.scaled(targetSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->label->setPixmap(QPixmap::fromImage(scaledImage));
}
通过信号和曹把label坐标系传到主界面 然后进行还原计算原图坐标系