mylabel.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "mylabel.h"
  2. #include <QPainter>
  3. #include <QDebug>
  4. #include <QWheelEvent>
  5. #include <QMenu>
  6. #include <QFileDialog>
  7. MyLabel::MyLabel(QWidget *parent):QLabel(parent)
  8. {
  9. }
  10. //QPainter画图
  11. void MyLabel::paintEvent(QPaintEvent *event)
  12. {
  13. if (LocalFileName.isNull())
  14. return QWidget::paintEvent(event);
  15. Image.load(LocalFileName);
  16. QPainter painter(this);
  17. // 根据窗口计算应该显示的图片的大小
  18. int width = qMin(Image.width(), this->width());
  19. int height = width * 1.0 / (Image.width() * 1.0 / Image.height());
  20. height = qMin(height, this->height());
  21. width = height * 1.0 * (Image.width() * 1.0 / Image.height());
  22. // 平移
  23. painter.translate(this->width() / 2 + XPtInterval, this->height() / 2 + YPtInterval);
  24. // 缩放
  25. painter.scale(ZoomValue, ZoomValue);
  26. // 绘制图像
  27. QRect picRect(-width / 2, -height / 2, width, height);
  28. painter.drawImage(picRect, Image);
  29. }
  30. //鼠标滚轮滚动
  31. void MyLabel::wheelEvent(QWheelEvent *event)
  32. {
  33. int value = event->delta();
  34. if (value > 0) //放大
  35. OnZoomInImage();
  36. else //缩小
  37. OnZoomOutImage();
  38. update();
  39. }
  40. //鼠标摁下
  41. void MyLabel::mousePressEvent(QMouseEvent *event)
  42. {
  43. OldPos = event->pos();
  44. Pressed = true;
  45. }
  46. //鼠标松开
  47. void MyLabel::mouseMoveEvent(QMouseEvent *event)
  48. {
  49. if (!Pressed)
  50. return QWidget::mouseMoveEvent(event);
  51. this->setCursor(Qt::SizeAllCursor);
  52. QPoint pos = event->pos();
  53. int xPtInterval = pos.x() - OldPos.x();
  54. int yPtInterval = pos.y() - OldPos.y();
  55. XPtInterval += xPtInterval;
  56. YPtInterval += yPtInterval;
  57. OldPos = pos;
  58. update();
  59. }
  60. //鼠标发射事件
  61. void MyLabel::mouseReleaseEvent(QMouseEvent */*event*/)
  62. {
  63. Pressed = false;
  64. setCursor(Qt::ArrowCursor);
  65. }
  66. //选择打开图片
  67. void MyLabel::OnSelectImage()
  68. {
  69. LocalFileName = QFileDialog::getOpenFileName(this, "Open Image", "./", tr("Images (*.png *.xpm *.jpg)"));
  70. QFile file(LocalFileName);
  71. if (!file.exists())
  72. return;
  73. ZoomValue = 1.0;
  74. XPtInterval = 0;
  75. YPtInterval = 0;
  76. update();
  77. }
  78. //图片放大
  79. void MyLabel::OnZoomInImage()
  80. {
  81. ZoomValue += 0.05;
  82. update();
  83. }
  84. //图片缩小
  85. void MyLabel::OnZoomOutImage()
  86. {
  87. ZoomValue -= 0.05;
  88. if (ZoomValue <= 0)
  89. {
  90. ZoomValue = 0.05;
  91. return;
  92. }
  93. update();
  94. }
  95. //图片还原
  96. void MyLabel::OnPresetImage()
  97. {
  98. ZoomValue = 1.0;
  99. XPtInterval = 0;
  100. YPtInterval = 0;
  101. update();
  102. }
  103. //右键菜单
  104. void MyLabel::contextMenuEvent(QContextMenuEvent *event)
  105. {
  106. QPoint pos = event->pos();
  107. pos = this->mapToGlobal(pos);
  108. QMenu *menu = new QMenu(this);
  109. QAction *loadImage = new QAction(this);
  110. loadImage->setText("选择图片");
  111. connect(loadImage, &QAction::triggered, this, &MyLabel::OnSelectImage);
  112. menu->addAction(loadImage);
  113. menu->addSeparator();
  114. QAction *zoomInAction = new QAction(this);
  115. zoomInAction->setText("放大");
  116. connect(zoomInAction, &QAction::triggered, this, &MyLabel::OnZoomInImage);
  117. menu->addAction(zoomInAction);
  118. QAction *zoomOutAction = new QAction(this);
  119. zoomOutAction->setText("缩小");
  120. connect(zoomOutAction, &QAction::triggered, this, &MyLabel::OnZoomOutImage);
  121. menu->addAction(zoomOutAction);
  122. QAction *presetAction = new QAction(this);
  123. presetAction->setText("还原");
  124. connect(presetAction, &QAction::triggered, this, &MyLabel::OnPresetImage);
  125. menu->addAction(presetAction);
  126. menu->exec(pos);
  127. }