欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > QLable提升类

QLable提升类

2024/10/26 0:25:13 来源:https://blog.csdn.net/weixin_66651900/article/details/142105665  浏览:    关键词:QLable提升类

实现:

        1.图片移动、保持纵横比缩放、右键菜单

1.myLabel.h 

#ifndef MYLABEL_H
#define MYLABEL_H#include <QLabel>class MyLabel : public QLabel
{Q_OBJECT
public:MyLabel(QWidget *parent = nullptr);
private:void contextMenuEvent(QContextMenuEvent* e) override;void mousePressEvent(QMouseEvent* e) override;void mouseReleaseEvent(QMouseEvent* e) override;void mouseMoveEvent(QMouseEvent* e) override;void paintEvent(QPaintEvent* e) override;void wheelEvent(QWheelEvent* e) override;double m_zoomValue = 1.0;bool isPress = false;int m_XPtInterval = 0;int m_YPtInterval = 0;QPoint m_OldPos;private slots:void onLoadImage(void);void onZoomInImage(void);void onZoomOutImage(void);void onPresetImage(void);};#endif // MYLABEL_H

 2.myLabel.cpp

#include "myLabel.h"#include <QMenu>
#include <QPaintEvent>
#include <QPainter>
#include <QWheelEvent>
MyLabel::MyLabel(QWidget *parent):QLabel(parent)
{// setScaledContents(true);// this->setAlignment(Qt::AlignCenter);//如果图片太大,这个可以保证图片不会放大//setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);}void MyLabel::contextMenuEvent(QContextMenuEvent *e)
{QPoint pos = e->pos();pos = this->mapToGlobal(pos);QMenu *menu = new QMenu(this);QAction *loadImage = new QAction(tr("图片放大"));QObject::connect(loadImage, &QAction::triggered, this, &MyLabel::onLoadImage);menu->addAction(loadImage);// menu->addSeparator();QAction *zoomInAction = new QAction(tr("图片居中还原"));QObject::connect(zoomInAction, &QAction::triggered, this, &MyLabel::onZoomInImage);menu->addAction(zoomInAction);QAction *zoomOutAction = new QAction(tr("3"));QObject::connect(zoomOutAction, &QAction::triggered, this, &MyLabel::onZoomOutImage);menu->addAction(zoomOutAction);QAction *presetAction = new QAction(tr("4"));QObject::connect(presetAction, &QAction::triggered, this, &MyLabel::onPresetImage);menu->addAction(presetAction);menu->exec(pos);// menu->show();}void MyLabel::mousePressEvent(QMouseEvent *e)
{if(e->button() == Qt::LeftButton){isPress = true;m_OldPos = e->pos();}
}void MyLabel::mouseReleaseEvent(QMouseEvent *e)
{isPress = false;this->setCursor(Qt::ArrowCursor);
}void MyLabel::mouseMoveEvent(QMouseEvent *e)
{if (!isPress)return QWidget::mouseMoveEvent(e);this->setCursor(Qt::SizeAllCursor);QPoint pos = e->pos();int xPtInterval = pos.x() - m_OldPos.x();int yPtInterval = pos.y() - m_OldPos.y();m_XPtInterval += xPtInterval;m_YPtInterval += yPtInterval;m_OldPos = pos;this->update();
}void MyLabel::paintEvent(QPaintEvent* e){if(this->pixmap().isNull()){return QLabel::paintEvent(e);}QPainter painter(this);int width = qMin(pixmap().width(), this->width());int height = width * 1.0 / (pixmap().width() * 1.0 /pixmap().height());height = qMin(height, this->height());width = height * 1.0 * (pixmap().width() * 1.0 / pixmap().height());painter.translate(this->width() / 2+m_XPtInterval, this->height() / 2+m_YPtInterval );painter.scale(m_zoomValue,m_zoomValue);QRect rect(-width/2,-height/2,width,height);painter.drawImage(rect,this->pixmap().toImage());// return QLabel::paintEvent(e);
}void MyLabel::wheelEvent(QWheelEvent *e)
{int p = e->angleDelta().y();if(p>0){m_zoomValue += 0.1;update();}if(p<0){m_zoomValue -= 0.1;update();}}void MyLabel::onLoadImage()
{MyLabel* label = new MyLabel();label->setWindowTitle(parent()->objectName());label->setPixmap(pixmap());label->showMaximized();}void MyLabel::onZoomInImage()
{m_XPtInterval = 0;m_YPtInterval = 0;m_zoomValue = 1.0;update();
}void MyLabel::onZoomOutImage()
{}void MyLabel::onPresetImage()
{}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com