ZBLOG

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

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

修改后的代码示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QWheelEvent>
#include <QKeyEvent>
#include <QMouseEvent>

class ImageView : public QGraphicsView {
    Q_OBJECT

public:
    explicit ImageView(const QString &imagePath, QWidget *parent = nullptr)
        : QGraphicsView(parent), scaleFactor(1.0), dragging(false) {
        scene = new QGraphicsScene(this);
        imageItem = new QGraphicsPixmapItem(QPixmap(imagePath));
        scene->addItem(imageItem);
        setScene(scene);

        // Enable mouse tracking
        setMouseTracking(true);
        
        // Set initial size of the view
        setRenderHint(QPainter::Antialiasing);
        setRenderHint(QPainter::SmoothPixmapTransform);
    }

protected:
    void wheelEvent(QWheelEvent *event) override {
        // Zoom in or out based on wheel rotation
        if (event->angleDelta().y() > 0) {
            scaleImage(1.2);  // Zoom in
        } else {
            scaleImage(1.0 / 1.2);  // Zoom out
        }
    }

    void keyPressEvent(QKeyEvent *event) override {
        switch (event->key()) {
            case Qt::Key_Left:
                translateImage(-10, 0);
                break;
            case Qt::Key_Right:
                translateImage(10, 0);
                break;
            case Qt::Key_Up:
                translateImage(0, -10);
                break;
            case Qt::Key_Down:
                translateImage(0, 10);
                break;
            default:
                QGraphicsView::keyPressEvent(event);
                break;
        }
    }

    void mousePressEvent(QMouseEvent *event) override {
        if (event->button() == Qt::LeftButton) {
            dragging = true;
            lastPos = event->pos();
            setCursor(Qt::ClosedHandCursor); // Change cursor to indicate dragging
        }
    }

    void mouseMoveEvent(QMouseEvent *event) override {
        if (dragging) {
            QPoint delta = event->pos() - lastPos;
            translateImage(delta.x(), delta.y());
            lastPos = event->pos(); // Update last position for next move
       }
   }

   void mouseReleaseEvent(QMouseEvent *event) override {
       if (event->button() == Qt::LeftButton && dragging) {
           dragging = false;
           unsetCursor(); // Reset cursor when done dragging
       }
   }

private:
    QGraphicsScene *scene;
    QGraphicsPixmapItem *imageItem;
    qreal scaleFactor; 
    bool dragging; 
    QPoint lastPos;

private slots:
    void scaleImage(qreal factor) {
       scaleFactor *= factor;
       imageItem->setScale(scaleFactor);

       adjustScrollBars();
   }

   void translateImage(int dx, int dy) {
       imageItem->moveBy(dx / scaleFactor, dy / scaleFactor); // Adjust by zoom level

       adjustScrollBars();
   }

   void adjustScrollBars() {       
      QRectF rect = scene->itemsBoundingRect();
      horizontalScrollBar()->setRange(0, rect.width());
      verticalScrollBar()->setRange(0, rect.height());

      horizontalScrollBar()->setValue(horizontalScrollBar()->value());
      verticalScrollBar()->setValue(verticalScrollBar()->value());
      
      centerOn(imageItem); // Center the item within the view after adjusting scroll bars.
   }
};

主要修改点:

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

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

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

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?