自定义QLabel,完成移动、缩放、复位、点击后显示位置和灰度值

#include <QLabel>
#include <QWheelEvent>
#include <QMouseEvent>
#include <QPixmap>
#include <QPainter>

class slabel :public QLabel
{
public:
    slabel(QWidget *parent = nullptr);
    bool cmove=false;
    double Width0;
    double Height0;
    double Width;
    double Height;
    double m_scaleValue0 = 2;

protected:
    void paintEvent(QPaintEvent *) override;
    void mouseMoveEvent(QMouseEvent *ev) override;
    void mousePressEvent(QMouseEvent *ev) override;
    void mouseReleaseEvent(QMouseEvent *ev) override;
    void wheelEvent(QWheelEvent *event) override;
    void resizeEvent(QResizeEvent *event) override;
    void changeWheelValue(QPoint event, int value);


    double m_scaleValue;      // 图片缩放倍数
    QPointF m_drawPoint;      // 绘图起点
    QPointF m_mousePoint;     // 鼠标当前位置点
    QRect m_rectPixmap;       // 被绘图片的矩形范围
    bool m_isMousePress;      // 鼠标是否按下
    QLabel* infoLabel;

    const double SCALE_MAX_VALUE = 20.0;//最大放大到原来的20倍
    const double SCALE_MIN_VALUE = 0.1;//最小缩小到原来的0.1倍
};


#include "slabel.h"

slabel::slabel(QWidget *parent) :QLabel(parent)
, m_scaleValue(0.3)
, m_mousePoint(0, 0)
, m_drawPoint(0, 0)
, m_rectPixmap(0, 0, 0, 0)
, m_isMousePress(0)

{
    infoLabel = new QLabel(this);
    infoLabel->setStyleSheet("background-color: black; color: red; border: 1px solid black; padding: 5px;");
    infoLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
    infoLabel->setWordWrap(true);
    infoLabel->setMinimumSize(200, 30);
}

void slabel::paintEvent(QPaintEvent *)
{
    QPainter painter(this);

    QPixmap scalePixmap;
    QRectF target;
    if (this->pixmap()->width() !=this->pixmap()->height()) {
        Width = this->pixmap()->width()*m_scaleValue;
        Height = Width / this->pixmap()->width() * this->pixmap()->height();
    }
    else if(this->pixmap()->width() == this->pixmap()->height()){
        Width = std::min(this->height(), this->width())*m_scaleValue;
        Height = Width;
    }
    else {
        Width = this->width();
        Height = Width / 5096 * 2968;
    }

    if (!cmove) {
        m_drawPoint = QPointF((this->width() - Width) / 2, (this->height() - Height) / 2);

        m_rectPixmap = QRect(m_drawPoint.x(), m_drawPoint.y(), Width, Height);  // 图片区域
    }
    else m_rectPixmap = QRect(m_drawPoint.x(), m_drawPoint.y(), Width, Height);
    scalePixmap = this->pixmap()->scaled(Width, Height);
    painter.drawPixmap(m_rectPixmap,scalePixmap);




}

void slabel::mouseMoveEvent(QMouseEvent *event)
{
    if (m_isMousePress)
    {
        int x = event->pos().x() - m_mousePoint.x();
        int y = event->pos().y() - m_mousePoint.y();
        m_mousePoint = event->pos();
        m_drawPoint = QPointF(m_drawPoint.x() + x, m_drawPoint.y() + y);
        update();
    }
}

void slabel::mousePressEvent(QMouseEvent *event)
{

    if (event->button() == Qt::LeftButton)
    {

        m_isMousePress = true;
        m_mousePoint = event->pos();
        cmove = true;


        QPixmap pixmap = *(this->pixmap());
        QImage img = pixmap.toImage();


        int posx = (m_mousePoint.x()- m_drawPoint.x()) / m_scaleValue;
        int posy = (m_mousePoint.y()- m_drawPoint.y()) / m_scaleValue;


        if (m_mousePoint.x()- m_drawPoint.x() < Width && m_mousePoint.y()- m_drawPoint.y() < Height &&m_mousePoint.x()- m_drawPoint.x()>=0 &&m_mousePoint.y()- m_drawPoint.y()>=0 ){
        int grayValue = qRed(img.pixel(posx,posy));  // 使用qRed获取灰度值
        infoLabel->setText(QString("pos: (%1, %2), val: %3").arg(posx).arg(posy).arg(grayValue));
        infoLabel->move(m_mousePoint.x(),m_mousePoint.y()); // Adjust the position of the info label
        }
    }
}

void slabel::mouseReleaseEvent(QMouseEvent *event)
{

    if (event->button() == Qt::RightButton)
    {
        cmove = false;
        m_drawPoint = QPointF(0, 0);
        m_scaleValue = m_scaleValue0;
        update();
    }
    if (event->button() == Qt::LeftButton) m_isMousePress = false;
}

void slabel::wheelEvent(QWheelEvent *event)
{
    changeWheelValue(event->pos(), event->delta());
    event->accept();
}

void slabel::resizeEvent(QResizeEvent *event)
{
    m_drawPoint = QPointF(0, 0);
    m_scaleValue = m_scaleValue0;
    update();
}

void slabel::changeWheelValue(QPoint event, int numSteps)
{
    double oldScale = m_scaleValue;
    if (numSteps>0)
    {
        m_scaleValue *= 2;
    }
    else
    {
        m_scaleValue *= 0.5;
    }
    if (m_scaleValue>(SCALE_MAX_VALUE))
    {
        m_scaleValue = SCALE_MAX_VALUE;
    }
    if (m_scaleValue<(SCALE_MIN_VALUE))
    {
        m_scaleValue = SCALE_MIN_VALUE;
    }

    if (m_rectPixmap.contains(event))
    {
        double x = m_drawPoint.x() - (event.x() - m_drawPoint.x()) / m_rectPixmap.width()*(this->width()*(m_scaleValue - oldScale));
        double y = m_drawPoint.y() - (event.y() - m_drawPoint.y()) / m_rectPixmap.height()*(this->height()*(m_scaleValue - oldScale));
        m_drawPoint = QPointF(x, y);
    }
    else
    {
        double x = m_drawPoint.x() - (this->width()*(m_scaleValue - oldScale)) / 2;
        double y = m_drawPoint.y() - (this->height()*(m_scaleValue - oldScale)) / 2;
        m_drawPoint = QPointF(x, y);
    }
    update();
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过继承 QLabel 类来实现自定义 QLabel,然后可以通过以下方法设置背景颜色、文字颜色和滚动效果。 设置背景颜色: 可以通过 `setStyleSheet` 方法设置样式表来实现设置背景颜色,示例代码如下: ```cpp class MyLabel : public QLabel { public: MyLabel(QWidget* parent = nullptr); private: void init(); }; MyLabel::MyLabel(QWidget* parent) : QLabel(parent) { init(); } void MyLabel::init() { setStyleSheet("background-color: red;"); } ``` 设置文字颜色: 可以通过 `setStyleSheet` 方法设置样式表来实现设置文字颜色,示例代码如下: ```cpp class MyLabel : public QLabel { public: MyLabel(QWidget* parent = nullptr); private: void init(); }; MyLabel::MyLabel(QWidget* parent) : QLabel(parent) { init(); } void MyLabel::init() { setStyleSheet("color: blue;"); } ``` 设置文字滚动: 可以通过继承 `QLabel` 类,并重写 `paintEvent` 方法来实现文字滚动效果,示例代码如下: ```cpp class MyLabel : public QLabel { public: MyLabel(QWidget* parent = nullptr); private: void init(); void paintEvent(QPaintEvent *ev) override; QTimer* timer; int pos = 0; }; MyLabel::MyLabel(QWidget* parent) : QLabel(parent) { init(); } void MyLabel::init() { setText("Hello World!"); timer = new QTimer(this); connect(timer, &QTimer::timeout, [this](){ if (pos == width()) { pos = -fontMetrics().width(text()); } else { pos++; } update(); }); timer->start(10); } void MyLabel::paintEvent(QPaintEvent *ev) { QPainter painter(this); painter.drawText(pos, 0, text()); } ``` 以上代码通过重写 `paintEvent` 方法来实现文字滚动效果,每隔一定时间更新 `pos` 变量的,然后重新绘制 `QLabel` 即可。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值