解决使用QGraphicsView QGraphicsScene默认显示居中的终极办法

本文介绍了QGraphicsView网格元素排布实现自定义item的方法。包括设置left top、画布QGraphicsScene大小(宽取graphicsView的width,高根据item数量动态计算)、图元相对于画布的位置。按此操作,动态改变graphicsView高度时item会自动排布。

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

QGraphicsView  网格元素的排布,实现如下自定义item

 

正常情况如下,我们创建一个item,并添加到QGraphicsScene,元素显示在正中间,那么我们如何让他自动从上排到下呢?

QGraphicsItem* item = new QGraphicsItem    
item->setPos(x,y); //图元位于场景的中心
m_pListScene->addItem(item);
ui->graphicsView->setScene(m_pListScene);

1.设置left top 

ui->graphicsView->setAlignment(Qt::AlignLeft | Qt::AlignTop);

2.设置画布QGraphicsScene的大小,宽取graphicsView得width,高需要根据item数量动态计算,如果这里不设置高的画,那么有些元素将不被显示,也无法触发滚动条

m_pListScene->setSceneRect(0,0,sceneWidth,sceneHeight);

3.设置图元的相对与画布的位置,x,y是相对于画布原点(0,0)

item->setPos(x,y);

4.大功告成,这样即使你动态改变graphicsView的高度也没关系,item会自动排布一次。

 

学习QT一个多月,优快云能查到的解决方案也并不合理,只能自己多看文档多尝试,希望这些对您也有帮助,欢迎留言共同探讨!

 

 

 

### QGraphicsViewQGraphicsScene 的事件处理 在 Qt 中,`QGraphicsView` 和 `QGraphicsScene` 提供了一套完整的事件处理机制来响应用户的交互操作。这些事件可以分为几类:鼠标事件、键盘事件和其他自定义事件。 #### 鼠标事件处理 为了捕获并处理鼠标事件,在继承 `QGraphicsItem` 或其子类的对象中重写相应的虚函数即可实现特定功能。以下是常见的几个用于捕捉鼠标的成员函数: - `mousePressEvent`: 当按下鼠标按钮时触发。 - `mouseReleaseEvent`: 松开鼠标按键时调用此方法。 - `mouseMoveEvent`: 移动光标期间持续发送信号给当前选中的图形项。 - `hoverEnterEvent`, `hoverLeaveEvent`, `hoverMoveEvent`: 这些仅当启用了 hover 选项 (`setAcceptHoverEvents(true)`) 后才会生效;它们分别对应于指针进入项目范围、离开以及在其上移动的情况。 下面是一个简单的例子展示如何创建一个圆形图元,并为其添加基本的点击反馈效果[^1]: ```cpp class Circle : public QObject, public QGraphicsEllipseItem { Q_OBJECT protected: void mousePressEvent(QGraphicsSceneMouseEvent *event) override; }; void Circle::mousePressEvent(QGraphicsSceneMouseEvent *) { setBrush(Qt::red); } ``` 这段代码展示了如何通过覆盖 `mousePressEvent()` 方法改变被单击圆圈的颜色为红色。 #### 键盘事件处理 对于需要监听键盘输入的应用程序来说,可以通过覆写 `keyPressEvent` 函数来进行相应逻辑编写。需要注意的是,默认情况下只有获得了焦点(`focus`) 的 widget 才能接收到键入消息。因此如果希望整个场景都能接收,则需设置合适的 focus policy 并确保至少有一个 item 能够获取到该状态。 另外一种方式是在主窗口级别安装 event filter 对所有传入的消息进行筛选过滤,从而间接达到全局监控的目的。 #### 自定义事件分发 除了上述两种常见类型的事件外,还可以利用 Qt 的事件系统来自定义新的行为模式。这通常涉及到构造一个新的 `QEvent` 子类别实例并向目标对象传递它。之后再由后者决定是否接受及怎样回应这种特殊的请求形式。 例如,可以在应用程序内部广播通知其他组件某些条件已满足的信息流更新等动作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值