Qt的QGraphics View的使用

打印 上一主题 下一主题

主题 953|帖子 953|积分 2859

QGraphics View 框架是 Qt 中用于管理和渲染大量 2D 图形对象的强大工具,得当构建绘图软件、游戏编辑器、数据可视化等场景。以下是关键使用步调和示例:

1. 核心组件



  • QGraphicsScene:场景容器,管理所有图形项(Item)的层级、坐标和事件。
  • QGraphicsView:视图组件,用于表现场景内容,支持缩放、旋转、滚动等操纵。
  • QGraphicsItem:所有图形项的基类(如矩形、椭圆、自界说图形)。

2. 底子使用步调

2.1 创建场景和视图

  1. #include <QApplication>
  2. #include <QGraphicsScene>
  3. #include <QGraphicsView>
  4. #include <QGraphicsRectItem>
  5. int main(int argc, char *argv[]) {
  6.     QApplication app(argc, argv);
  7.     // 创建场景(设置场景范围)
  8.     QGraphicsScene *scene = new QGraphicsScene();
  9.     scene->setSceneRect(0, 0, 800, 600);
  10.     // 添加图形项(例如红色矩形)
  11.     QGraphicsRectItem *rect = scene->addRect(50, 50, 200, 100);
  12.     rect->setBrush(Qt::red);
  13.     // 创建视图并关联场景
  14.     QGraphicsView *view = new QGraphicsView(scene);
  15.     view->setWindowTitle("Graphics View Demo");
  16.     view->resize(800, 600);
  17.     view->show();
  18.     return app.exec();
  19. }
复制代码
2.2 自界说图形项

继续 QGraphicsItem 并重写关键方法:
  1. class CustomItem : public QGraphicsItem {
  2. public:
  3.     QRectF boundingRect() const override {
  4.         return QRectF(-10, -10, 20, 20); // 定义绘制区域
  5.     }
  6.     void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) override {
  7.         painter->setBrush(Qt::blue);
  8.         painter->drawEllipse(-10, -10, 20, 20); // 绘制蓝色圆形
  9.     }
  10.     // 鼠标事件示例
  11.     void mousePressEvent(QGraphicsSceneMouseEvent *event) override {
  12.         qDebug() << "Item clicked!";
  13.         QGraphicsItem::mousePressEvent(event);
  14.     }
  15. };
  16. // 使用自定义项
  17. CustomItem *item = new CustomItem();
  18. scene->addItem(item);
  19. item->setPos(100, 100);
复制代码

3. 交互与高级功能

3.1 视图变换(缩放/旋转)

  1. // 缩放视图
  2. view->scale(1.2, 1.2); // 放大20%
  3. // 旋转视图
  4. view->rotate(45); // 顺时针旋转45度
  5. // 启用鼠标拖拽滚动
  6. view->setDragMode(QGraphicsView::ScrollHandDrag);
复制代码
3.2 坐标转换

  1. // 将视图坐标转换为场景坐标
  2. QPointF scenePos = view->mapToScene(view->mapFromGlobal(QCursor::pos()));
  3. // 获取图形项的全局位置
  4. QPointF itemGlobalPos = item->mapToScene(item->boundingRect().center());
复制代码
3.3 动画效果

使用 QPropertyAnimation 实现移动动画:
  1. QPropertyAnimation *anim = new QPropertyAnimation(item, "pos");
  2. anim->setDuration(1000);
  3. anim->setStartValue(QPointF(0, 0));
  4. anim->setEndValue(QPointF(300, 300));
  5. anim->start();
复制代码

4. 性能优化



  • 启用场景索引:加速碰撞检测和项查找。
    1. scene->setItemIndexMethod(QGraphicsScene::BspTreeIndex);
    复制代码
  • OpenGL 渲染(需链接 Qt OpenGL 模块):
    1. view->setViewport(new QOpenGLWidget());
    复制代码
  • 批量绘制:复杂项可合并绘制到 QGraphicsPixmapItem 中。

5. 常见问题

图形项不表现?



  • 检查是否将 Item 添加到 Scene。
  • 确认 Item 的 boundingRect() 和 paint() 精确实现。
事件未触发?



  • 确保 Item 设置了 setAcceptHoverEvents(true) 或 setFlags(QGraphicsItem::ItemIsFocusable)。

6. 完整示例代码

GitHub 示例仓库 中查看 Qt 官方示例。
掌握这些核心概念后,可进一步探索信号槽交互、复杂结构管理和3D集成(通过 QGraphicsView + OpenGL)等高级主题。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表