ZBLOG

可以加上鼠标点击移动图片操作吗

当然可以!要实现鼠标点击和拖动移动图片的功能,可以重载 mousePressEventmouseMoveEventmouseReleaseEvent 方法来处理鼠标事件。下面是更新后的代码示例:

更新后的示例代码

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

class ImageView : public QGraphicsView {
    Q_OBJECT

public:
    ImageView(QWidget *parent = nullptr) : QGraphicsView(parent), scaleFactor(1.0), dragging(false) {
        scene = new QGraphicsScene(this);
        setScene(scene);

        // 加载并显示图片
        QPixmap pixmap("path/to/your/image.jpg");
        imageItem = scene->addPixmap(pixmap);
        
        // 设置视图背景颜色(可选)
        setBackgroundBrush(Qt::black);
        
        // 启用鼠标跟踪
        setMouseTracking(true);
    }

protected:
    void wheelEvent(QWheelEvent *event) override {
        // 缩放处理
        if (event->angleDelta().y() > 0)
            scaleImage(1.2); // 放大
        else
            scaleImage(1 / 1.2); // 缩小
    }

    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);
        }
    }

    void mousePressEvent(QMouseEvent *event) override {
        if (event->button() == Qt::LeftButton) {
            lastPos = event->pos();
            dragging = true; // 开始拖动
        }
    }

    void mouseMoveEvent(QMouseEvent *event) override {
        if (dragging && event->buttons() & Qt::LeftButton) {
            QPointF delta = mapToScene(event->pos()) - mapToScene(lastPos);
            imageItem->moveBy(delta.x(), delta.y());
            lastPos = event->pos(); // 更新最后位置
        }
    }

    void mouseReleaseEvent(QMouseEvent *event) override {
        if (event->button() == Qt::LeftButton) {
            dragging = false; // 停止拖动
        }
    }

private:
    QGraphicsScene *scene;
    QGraphicsPixmapItem *imageItem;
    
    qreal scaleFactor;
    
    bool dragging;          // 拖动状态标志
    QPoint lastPos;         // 上一个鼠标位置

    void scaleImage(qreal factor) {
        scaleFactor *= factor;

        // 确保不会无穷缩放,限制最大和最小值。
        if (scaleFactor < 0.1) scaleFactor = 0.1; 
        if (scaleFactor > 5.0) scaleFactor = 5.0; 

        imageItem->setScale(scaleFactor);
    }

    void translateImage(qreal dx, qreal dy) {
         QPointF pos = imageItem->pos();
         imageItem->setPos(pos.x() + dx, pos.y() + dy);
     }
};

int main(int argc, char *argv[]) {
   QApplication app(argc, argv);

   ImageView view;
   view.setWindowTitle("Image Viewer with Zoom and Pan");
   view.resize(800, 600);
   view.show();

   return app.exec();
}

#include "main.moc"

使用说明

  • 缩放:使用鼠标滚轮进行缩放。
  • 键盘平移:使用上下左右方向键进行平移。
  • 鼠标拖动:按住鼠标左键并拖动可以移动图片。

注意事项

  • 请确保将 "path/to/your/image.jpg" 替换为实际的图片路径。
  • 此代码中添加了 dragging 标志,以跟踪是否正在进行拖动操作,并通过 lastPos 来计算新的位置。这样就可以使用鼠标操作来移动图像。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?