QT LABEL上加载图片 并在图片上绘制图形 获取对应像素坐标

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坐标系传到主界面 然后进行还原计算原图坐标系

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值