ZBLOG

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

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

更新后的示例代码

  1. #include <QApplication>
  2. #include <QGraphicsView>
  3. #include <QGraphicsScene>
  4. #include <QGraphicsPixmapItem>
  5. #include <QGraphicsRectItem>
  6. #include <QWheelEvent>
  7. #include <QKeyEvent>
  8. class ImageView : public QGraphicsView {
  9. Q_OBJECT
  10. public:
  11. ImageView(QWidget *parent = nullptr) : QGraphicsView(parent), scaleFactor(1.0), dragging(false) {
  12. scene = new QGraphicsScene(this);
  13. setScene(scene);
  14. // 加载并显示图片
  15. QPixmap pixmap("path/to/your/image.jpg");
  16. imageItem = scene->addPixmap(pixmap);
  17. // 创建移动边界的矩形框
  18. boundaryRect = new QGraphicsRectItem(imageItem->boundingRect());
  19. boundaryRect->setPen(QPen(Qt::red, 2)); // 设置边框颜色和宽度
  20. boundaryRect->setBrush(Qt::transparent); // 填充透明
  21. scene->addItem(boundaryRect);
  22. // 设置视图背景颜色(可选)
  23. setBackgroundBrush(Qt::black);
  24. // 启用鼠标跟踪
  25. setMouseTracking(true);
  26. }
  27. protected:
  28. void wheelEvent(QWheelEvent *event) override {
  29. // 缩放处理
  30. if (event->angleDelta().y() > 0)
  31. scaleImage(1.2); // 放大
  32. else
  33. scaleImage(1 / 1.2); // 缩小
  34. updateBoundary(); // 更新边界框的位置和大小
  35. }
  36. void keyPressEvent(QKeyEvent *event) override {
  37. switch (event->key()) {
  38. case Qt::Key_Left:
  39. translateImage(-10, 0); // 向左平移
  40. break;
  41. case Qt::Key_Right:
  42. translateImage(10, 0); // 向右平移
  43. break;
  44. case Qt::Key_Up:
  45. translateImage(0, -10); // 向上平移
  46. break;
  47. case Qt::Key_Down:
  48. translateImage(0, 10); // 向下平移
  49. break;
  50. default:
  51. QGraphicsView::keyPressEvent(event);
  52. }
  53. updateBoundary(); // 更新边界框的位置和大小
  54. }
  55. void mousePressEvent(QMouseEvent *event) override {
  56. if (event->button() == Qt::LeftButton) {
  57. lastPos = event->pos();
  58. dragging = true; // 开始拖动
  59. }
  60. }
  61. void mouseMoveEvent(QMouseEvent *event) override {
  62. if (dragging && event->buttons() & Qt::LeftButton) {
  63. QPointF delta = mapToScene(event->pos()) - mapToScene(lastPos);
  64. imageItem->moveBy(delta.x(), delta.y());
  65. lastPos = event->pos(); // 更新最后位置
  66. updateBoundary(); // 更新边界框的位置和大小
  67. }
  68. }
  69. void mouseReleaseEvent(QMouseEvent *event) override {
  70. if (event->button() == Qt::LeftButton) {
  71. dragging = false; // 停止拖动
  72. }
  73. }
  74. private:
  75. QGraphicsScene *scene;
  76. QGraphicsPixmapItem *imageItem;
  77. QGraphicsRectItem *boundaryRect; // 边界矩形项
  78. qreal scaleFactor;
  79. bool dragging; // 拖动状态标志
  80. QPoint lastPos; // 上一个鼠标位置
  81. void scaleImage(qreal factor) {
  82. scaleFactor *= factor;
  83. if (scaleFactor < 0.1) scaleFactor = 0.1;
  84. if (scaleFactor > 5.0) scaleFactor = 5.0;
  85. imageItem->setScale(scaleFactor);
  86. }
  87. void translateImage(qreal dx, qreal dy) {
  88. QPointF pos = imageItem->pos();
  89. imageItem->setPos(pos.x() + dx, pos.y() + dy);
  90. }
  91. void updateBoundary() {
  92. QRectF rect = imageItem->boundingRect();
  93. boundaryRect->setRect(rect.adjusted(-2, -2, 2, 2)); // 调整边界框以适应图片
  94. boundaryRect->setPos(imageItem->pos());  // 确保边界与图像对齐   
  95. }
  96. };
  97. int main(int argc, char *argv[]) {
  98.   QApplication app(argc, argv);
  99.   ImageView view;
  100.   view.setWindowTitle("Image Viewer with Zoom and Pan");
  101.   view.resize(800, 600);
  102.   view.show();
  103.   return app.exec();
  104. }
  105. #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

注册

已经有帐号?