ZBLOG

QT QMainWindow 移动大图片,当移动到最低端,最顶端,最左边,最右边时 禁止移动

QMainWindow 中移动大图片时,可以通过限制图像的移动范围来实现。当图像到达窗口的边缘时,禁止进一步的移动。以下是一个简单示例,演示如何实现这个功能。

示例代码

#include <QMainWindow>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QMouseEvent>

class ImageView : public QGraphicsView {
    Q_OBJECT

public:
    explicit ImageView(const QString &imagePath, QWidget *parent = nullptr)
        : QGraphicsView(parent), dragging(false) {
        scene = new QGraphicsScene(this);
        imageItem = new QGraphicsPixmapItem(QPixmap(imagePath));
        scene->addItem(imageItem);
        setScene(scene);
        
        // Enable mouse tracking
        setMouseTracking(true);
    }

protected:
    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;

            // 计算新位置并确保在边界内
            qreal newX = imageItem->x() + delta.x();
            qreal newY = imageItem->y() + delta.y();

            // 获取视口大小和场景边界
            QRectF viewRect = mapToScene(rect()).boundingRect();
            QRectF itemRect = imageItem->boundingRect();

            // 确保新位置不超出视口范围
            if (newX > viewRect.left()) newX = viewRect.left();
            if (newY > viewRect.top()) newY = viewRect.top();
            if (newX + itemRect.width() < viewRect.right()) newX = viewRect.right() - itemRect.width();
            if (newY + itemRect.height() < viewRect.bottom()) newY = viewRect.bottom() - itemRect.height();

            // 更新位置
            imageItem->setPos(newX, newY);
            
            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;
    bool dragging; 
    QPoint lastPos;
};

class MainWindow : public QMainWindow {
public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
        setFixedSize(800, 600); // 设置主窗口大小
        
        ImageView *imageView = new ImageView("path/to/your/image.jpg", this);
        setCentralWidget(imageView);   
    }
};

关键点说明:

  1. 鼠标事件处理:在 mouseMoveEvent 方法中,我们计算了新的图像位置并进行了检查,以确保图像不会超出当前视口的可见区域。

  2. 视口和项目边界:我们使用 mapToScene(rect()).boundingRect() 来获取视口的矩形,并使用 imageItem->boundingRect() 来获取图像项的矩形。

  3. 限制条件:根据当前的鼠标拖动方向,如果新位置超出了定义好的可移动区域,就将其调整回边界。

通过这些步骤,您就可以实现在达到窗口边缘后禁止继续移动的大图像。如果有更多需求或问题,请随时询问!


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?