ZBLOG

要c++实现

下面是一个使用 C++ 和 Qt 框架实现的示例,演示如何在 QGraphicsView 中移动图片,并与水平滚动条(QScrollBar)限制结合。

示例代码

  1. #include <QApplication>
  2. #include <QMainWindow>
  3. #include <QGraphicsView>
  4. #include <QGraphicsScene>
  5. #include <QGraphicsPixmapItem>
  6. #include <QSlider>
  7. #include <QVBoxLayout>
  8. #include <QWidget>
  9. class ImageMover : public QMainWindow {
  10. Q_OBJECT
  11. public:
  12. ImageMover() {
  13. setWindowTitle("Image Mover with Scrollbar");
  14. setGeometry(100, 100, 600, 500);
  15. // 创建场景和视图
  16. scene = new QGraphicsScene(this);
  17. view = new QGraphicsView(scene);
  18. // 加载图像并添加到场景中
  19. pixmapItem = new QGraphicsPixmapItem(QPixmap("your-image-url.jpg"));
  20. scene->addItem(pixmapItem);
  21. // 设置视图属性
  22. view->setRenderHint(QPainter::Antialiasing);
  23. // 创建滚动条
  24. scrollbar = new QSlider(Qt::Horizontal);
  25. scrollbar->setMinimum(-300); // 根据需要设置最小值
  26. scrollbar->setMaximum(0); // 根据需要设置最大值
  27. connect(scrollbar, &QSlider::valueChanged, this, &ImageMover::updateImagePosition);
  28. // 布局设置
  29. QVBoxLayout *layout = new QVBoxLayout();
  30. layout->addWidget(view);
  31. layout->addWidget(scrollbar);
  32. QWidget *container = new QWidget();
  33. container->setLayout(layout);
  34. setCentralWidget(container);
  35. }
  36. protected:
  37. void mousePressEvent(QMouseEvent *event) override {
  38. if (event->button() == Qt::LeftButton) {
  39. QPointF scenePos = view->mapToScene(event->pos());
  40. if (pixmapItem->isUnderMouse()) {
  41. offsetX = scenePos.x() - pixmapItem->x();
  42. offsetY = scenePos.y() - pixmapItem->y();
  43. dragging = true;
  44. }
  45. }
  46. event->accept();
  47. }
  48. void mouseMoveEvent(QMouseEvent *event) override {
  49. if (dragging) {
  50. QPointF newScenePos = view->mapToScene(event->pos());
  51. qreal newX = newScenePos.x() - offsetX;
  52. qreal newY = newScenePos.y() - offsetY;
  53. // 更新图片位置,限制在滚动条范围内
  54. qreal limitedX = std::max(newX, -300.0); // 最小限制为-300,根据你的需求调整
  55. limitedX = std::min(limitedX, 0.0); // 最大限制为0
  56. pixmapItem->setPos(limitedX, newY);
  57. }
  58. event->accept();
  59. }
  60. void mouseReleaseEvent(QMouseEvent *event) override {
  61. if (event->button() == Qt::LeftButton) {
  62.  dragging = false;  
  63.  }
  64.  event-accept();  
  65.  }
  66. private slots:
  67. void updateImagePosition() {
  68.  qreal value = scrollbar.value();
  69.  pixmapItem-setX(value);
  70.  }
  71. private:
  72. QGraphicsView *view;
  73. QGraphicsScene *scene;
  74. QGraphicsPixmapItem *pixmapItem;
  75. QSlider *scrollbar;
  76. bool dragging{false};
  77. qreal offsetX{0}, offsetY{0};
  78. };
  79. int main(int argc, char *argv[]) {
  80. QApplication app(argc, argv);
  81. ImageMover window;
  82. window.show();
  83. return app.exec();
  84. }
  85. #include "main.moc"

编译与运行

  1. 安装 Qt:确保你已经安装了 Qt 开发环境,可以从 Qt 官方网站 下载。

  2. 创建项目

    • 使用 Qt Creator 创建一个新的 Qt Widgets Application。
  3. 修改主源文件

    • 将上面的代码粘贴到项目的主源文件中,比如 main.cpp
  4. 替换图像路径

    • "your-image-url.jpg" 替换为实际的图像路径。
  5. 构建和运行

    • 使用 Qt Creator 构建并运行项目。你将看到一个窗口,其中可以通过鼠标拖拽来移动图片,同时可以使用滑块来控制图片的位置。

注意事项:

  • 确保你的项目包含 QT += widgets.pro 文件中。
  • 调整滚动条的最大和最小值,以适应你的需求。
  • 如果有其他功能需求或者问题,请随时问我!


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?