ImageWidget.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "ImageWidget.h"
  2. #include "ui_ImageWidget.h"
  3. #include <QPainter>
  4. #include <QDebug>
  5. ImageWidget::ImageWidget(QWidget *parent) :
  6. QWidget(parent),
  7. ui(new Ui::ImageWidget),
  8. isDragging(false),
  9. imageOffset(0, 0)
  10. {
  11. ui->setupUi(this);
  12. }
  13. ImageWidget::~ImageWidget()
  14. {
  15. delete ui;
  16. }
  17. void ImageWidget::setPixmap(const QPixmap& newPixmap) {
  18. this->pixmap = newPixmap;
  19. imageOffset = QPoint(0, 0); // 重置图片偏移量为(0, 0)
  20. update(); // 触发重绘
  21. }
  22. void ImageWidget::setPixmapAndPoint(const QPixmap& pixmap){
  23. this->pixmap = pixmap;
  24. update();
  25. }
  26. void ImageWidget::paintEvent(QPaintEvent *event) {
  27. QPainter painter(this);
  28. if (!pixmap.isNull()) {
  29. // 计算图片左上角坐标,使得图片中心与控件中心对齐
  30. int centerX = width() / 2;
  31. int centerY = height() / 2;
  32. int pixmapCenterX = pixmap.width() / 2;
  33. int pixmapCenterY = pixmap.height() / 2;
  34. int x = centerX - pixmapCenterX + imageOffset.x();
  35. int y = centerY - pixmapCenterY + imageOffset.y();
  36. painter.drawPixmap(x, y, pixmap);
  37. }
  38. }
  39. void ImageWidget::mousePressEvent(QMouseEvent *event) {
  40. if (event->button() == Qt::LeftButton) {
  41. lastMousePos = event->pos(); // 记录鼠标按下时的位置
  42. isDragging = true; // 设置正在拖动的标志
  43. setCursor(Qt::OpenHandCursor);
  44. }
  45. }
  46. void ImageWidget::mouseMoveEvent(QMouseEvent *event) {
  47. if (isDragging && (event->buttons() & Qt::LeftButton)) {
  48. QPoint delta = event->pos() - lastMousePos; // 计算鼠标移动的偏移量
  49. imageOffset += delta; // 更新图片的偏移量
  50. lastMousePos = event->pos(); // 更新鼠标位置
  51. update();
  52. }
  53. }
  54. void ImageWidget::mouseReleaseEvent(QMouseEvent *event) {
  55. if (event->button() == Qt::LeftButton) {
  56. isDragging = false; // 重置正在拖动的标志
  57. setCursor(Qt::ArrowCursor);
  58. }
  59. }
  60. void ImageWidget::mouseDoubleClickEvent(QMouseEvent *event){
  61. if (event->type() == QEvent::MouseButtonDblClick) {
  62. // 恢复原始图像
  63. sendDoubleClicksignal();
  64. }
  65. QWidget::mouseDoubleClickEvent(event);
  66. }