ZBLOG

鼠标点击移动还没有显示移动的边界, 能加上吗

当然可以!我们可以通过在拖动时使用一个矩形框来显示移动的边界。为了实现这一点,我们可以使用 QGraphicsRectItem 来绘制一个矩形框,表示当前图片的边界。以下是更新后的代码示例:

更新后的示例代码

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QGraphicsRectItem>
#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);

        // 创建移动边界的矩形框
        boundaryRect = new QGraphicsRectItem(imageItem->boundingRect());
        boundaryRect->setPen(QPen(Qt::red, 2)); // 设置边框颜色和宽度
        boundaryRect->setBrush(Qt::transparent); // 填充透明
        scene->addItem(boundaryRect);

        // 设置视图背景颜色(可选)
        setBackgroundBrush(Qt::black);
        
        // 启用鼠标跟踪
        setMouseTracking(true);
    }

protected:
    void wheelEvent(QWheelEvent *event) override {
        // 缩放处理
        if (event->angleDelta().y() > 0)
            scaleImage(1.2); // 放大
        else
            scaleImage(1 / 1.2); // 缩小
        
        updateBoundary(); // 更新边界框的位置和大小
    }

    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);
        }
        
         updateBoundary(); // 更新边界框的位置和大小
    }

    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(); // 更新最后位置

           updateBoundary(); // 更新边界框的位置和大小 
       }
   }

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

private:
   QGraphicsScene *scene;
   QGraphicsPixmapItem *imageItem;

   QGraphicsRectItem *boundaryRect;      // 边界矩形项
   
   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);
     }

     void updateBoundary() { 
         QRectF rect = imageItem->boundingRect();
         boundaryRect->setRect(rect.adjusted(-2, -2, 2, 2));  // 调整边界框以适应图片  
         boundaryRect->setPos(imageItem->pos());               // 确保边界与图像对齐     
     } 
};

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"

修改说明

  • 添加了 boundaryRect:这个 QGraphicsRectItem 用于显示移动的图片的边界。
  • 设置矩形属性:我们给矩形设置了红色的笔触,以便于查看,同时将其填充设为透明。
  • 更新函数 updateBoundary():每当进行缩放或平移操作时,会调用此函数更新矩形的尺寸和位置,使它总是跟随图片。

使用说明

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

请确保将 "path/to/your/image.jpg" 替换为实际的图片路径。这样,您就可以看到动态更新的红色矩形表示移动图像的范围了。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?