ZBLOG

上述代码鼠标移动图片和滚动条不同步,能修改吗

当然可以!为了确保鼠标移动和滚动条同步,你需要添加一些逻辑来更新滚动条的位置和范围。以下是如何修改你的 ImageView 类以解决这个问题。

修改后的代码示例

  1. #include <QGraphicsView>
  2. #include <QGraphicsScene>
  3. #include <QGraphicsPixmapItem>
  4. #include <QWheelEvent>
  5. #include <QKeyEvent>
  6. #include <QMouseEvent>
  7. class ImageView : public QGraphicsView {
  8. Q_OBJECT
  9. public:
  10. explicit ImageView(const QString &imagePath, QWidget *parent = nullptr)
  11. : QGraphicsView(parent), scaleFactor(1.0), dragging(false) {
  12. scene = new QGraphicsScene(this);
  13. imageItem = new QGraphicsPixmapItem(QPixmap(imagePath));
  14. scene->addItem(imageItem);
  15. setScene(scene);
  16. // Enable mouse tracking
  17. setMouseTracking(true);
  18. // Set initial size of the view
  19. setRenderHint(QPainter::Antialiasing);
  20. setRenderHint(QPainter::SmoothPixmapTransform);
  21. }
  22. protected:
  23. void wheelEvent(QWheelEvent *event) override {
  24. // Zoom in or out based on wheel rotation
  25. if (event->angleDelta().y() > 0) {
  26. scaleImage(1.2); // Zoom in
  27. } else {
  28. scaleImage(1.0 / 1.2); // Zoom out
  29. }
  30. }
  31. void keyPressEvent(QKeyEvent *event) override {
  32. switch (event->key()) {
  33. case Qt::Key_Left:
  34. translateImage(-10, 0);
  35. break;
  36. case Qt::Key_Right:
  37. translateImage(10, 0);
  38. break;
  39. case Qt::Key_Up:
  40. translateImage(0, -10);
  41. break;
  42. case Qt::Key_Down:
  43. translateImage(0, 10);
  44. break;
  45. default:
  46. QGraphicsView::keyPressEvent(event);
  47. break;
  48. }
  49. }
  50. void mousePressEvent(QMouseEvent *event) override {
  51. if (event->button() == Qt::LeftButton) {
  52. dragging = true;
  53. lastPos = event->pos();
  54. setCursor(Qt::ClosedHandCursor); // Change cursor to indicate dragging
  55. }
  56. }
  57. void mouseMoveEvent(QMouseEvent *event) override {
  58. if (dragging) {
  59. QPoint delta = event->pos() - lastPos;
  60. translateImage(delta.x(), delta.y());
  61. lastPos = event->pos(); // Update last position for next move
  62. }
  63. }
  64. void mouseReleaseEvent(QMouseEvent *event) override {
  65. if (event->button() == Qt::LeftButton && dragging) {
  66. dragging = false;
  67. unsetCursor(); // Reset cursor when done dragging
  68. }
  69. }
  70. private:
  71. QGraphicsScene *scene;
  72. QGraphicsPixmapItem *imageItem;
  73. qreal scaleFactor;
  74. bool dragging;
  75. QPoint lastPos;
  76. private slots:
  77. void scaleImage(qreal factor) {
  78. scaleFactor *= factor;
  79. imageItem->setScale(scaleFactor);
  80. adjustScrollBars();
  81. }
  82. void translateImage(int dx, int dy) {
  83. imageItem->moveBy(dx / scaleFactor, dy / scaleFactor); // Adjust by zoom level
  84. adjustScrollBars();
  85. }
  86. void adjustScrollBars() {
  87. QRectF rect = scene->itemsBoundingRect();
  88. horizontalScrollBar()->setRange(0, rect.width());
  89. verticalScrollBar()->setRange(0, rect.height());
  90. horizontalScrollBar()->setValue(horizontalScrollBar()->value());
  91. verticalScrollBar()->setValue(verticalScrollBar()->value());
  92. centerOn(imageItem); // Center the item within the view after adjusting scroll bars.
  93. }
  94. };

主要修改点:

  1. 缩放调整:在 scaleImage()translateImage() 方法中,调用了 adjustScrollBars() 来根据当前的视图状态调整滚动条。

  2. 坐标变换:在 translateImage() 方法中,将平移值除以当前的缩放因子,以确保图像移动的距离与缩放级别相符。

  3. 中心化:在每次调整后调用 centerOn(imageItem) 可以使视图始终关注当前图像位置。

通过这些更改,滚动条将更好地反映图片的位置,同时支持平移和缩放。这样用户就能有一个更加一致和流畅的体验。如果你还有其他问题或进一步需求,请告诉我!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=19174

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?