QGraphicsView

本文介绍了如何处理QGraphicsItem的大小不变性,获取视口大小和鼠标位置,强调了paint函数的实时刷新特性。重点讲解了继承关系中的可见性控制,以及如何正确设置父级和子级的可见性来实现线的显示与隐藏逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、item的大小不会随场景缩放而改变

2、获取view显示的场景大小

mapToScene(QRect(0, 0, viewport()->width(),viewport()->height())).boundingRect()

3、获取鼠标位置下的item

在mouseReleaseEvent或者mousePressEvent事件中:

QList<QGraphicsItem*> itemsgroup =this->getRoScene()->items(event->scenePos());

 4、paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)函数是实时刷新的,尽量不要往里面写函数,不然隔一会调用一次,容易卡。

 5、继承关系下的Visible()关系

父不可见则子不可见,所以如果想让子的子可用,要先让父可见,然后才可以对子的子做操作。举个例子:

1是2的子,2是3的子,4是3的子。1和4之间有一连线。

实现要求:

隐藏3的时候线不见,显示3的时候线可见。线显示的判断是两端都可见的时候,线可见。

实现过程:

要想让线不显示,在分别在2和3里让各自的子(1、4)不可见,再让自身2、3不可见。

想让线显示,就必须先让2、3可见,再让1、4可见。

如果先让1、4可见,再让2、3可见,线是不会显示的。

因为线在做显示判断的时候,2、3不可见,1、4可见,但由于继承关系,获取1、4是否可见的时候,仍是不可见

### 关于 QGraphicsView 的使用教程及常见问题 #### 什么是 QGraphicsView? `QGraphicsView` 是 Qt 提供的一个强大的二维图形视图框架组件,用于显示和管理复杂的场景 (`QGraphicsScene`)。它允许开发者轻松实现平移、缩放以及旋转等功能[^2]。 #### 如何创建基本的 QGraphicsView 应用程序? 以下是构建一个简单的 `QGraphicsView` 示例的核心代码: ```cpp #include <QApplication> #include <QGraphicsScene> #include <QGraphicsView> #include <QGraphicsRectItem> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建场景对象 QGraphicsScene scene; // 添加矩形到场景中 QGraphicsRectItem* rect_item = scene.addRect(-50, -50, 100, 100); rect_item->setBrush(QBrush(QColor("#4D9CF8"))); rect_item->setFlag(QGraphicsItem::ItemIsMovable, true); // 启用移动功能 // 创建视图并设置其场景 QGraphicsView view(&scene); view.setRenderHint(QPainter::Antialiasing); // 开启抗锯齿效果 view.show(); return app.exec(); } ``` 上述代码展示了如何初始化一个带有可移动矩形图元的简单场景,并将其绑定到 `QGraphicsView` 上进行展示[^1]。 --- #### 常见问题及其解决方案 1. **图形项无法正常显示** 如果发现某些图形项未能正确绘制在视图上,可能是因为它们超出了当前可见范围或者被其他图元遮挡。可以通过调整视图的中心位置来验证: ```cpp view.centerOn(rect_item); // 将视图聚焦到指定图元上 ``` 2. **用户交互无响应** 默认情况下,许多图元不具备交互能力(如拖动)。需要手动启用对应标志位,例如 `QGraphicsItem::ItemIsMovable` 或者捕获鼠标事件: ```cpp rect_item->setFlag(QGraphicsItem::ItemIsSelectable, true); rect_item->setAcceptHoverEvents(true); ``` 3. **渲染性能低下** 对于大规模复杂场景,建议优化渲染策略。可以尝试禁用不必要的特效或减少重绘频率[^5]: ```cpp view.setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); ``` 4. **动画效果卡顿** 当执行连续变换操作时可能会遇到帧率下降的情况。推荐利用时间轴控制器配合缓存技术提升流畅度[^3]: ```cpp QTimeLine timeLine; timeLine.setFrameRange(0, 100); QObject::connect(&timeLine, &QTimeLine::frameChanged, [=](int frame) { item->setScale(frame / 100.0); }); timeLine.start(); ``` 5. **坐标转换错误** 在多层嵌套结构下容易发生逻辑偏差现象。应合理运用映射接口完成精确计算: ```cpp QPointF globalPos = view.mapToScene(localPointInWidgetCoordinates); ``` --- #### 高级特性说明 - **复合变换** 可以组合多种几何变化形成更丰富的视觉表现形式。 - **动态布局支持** 结合 `QGraphicsGridLayout` 实现灵活的内容排列方案[^4]。 - **跨线程协作模式** 利用信号槽机制安全地传递消息给主线程更新界面状态。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值