简述
在图形视图框架中,QGraphicsScene 提供一个快速的接口,用于管理大量 item,QGraphicsItem 是场景中 item 的基类。
图形视图提供了一些典型形状的标准 item,当然,我们也可以自定义 item。除此之外,QGraphicsItem 还支持以下特性:
- 鼠标按下、移动、释放和双击事件,以及鼠标悬浮事件、滚轮事件和上下文菜单事件
- 键盘输入焦点和键盘事件
- 拖放
- 分组:通过父子关系,或 QGraphicsItemGroup
- 碰撞检测
下面,一起来看看 QGraphicsScene 对 QGraphicsItem 的管理,主要包括:单击、选择、移动、缩放、删除等。
操作细节
为了实现以上功能,我们主要实现了 QGraphicsScene 和 QGraphicsItem 对应的事件,通过鼠标和键盘来操作。
操作细节主要包括:
- 选择:点击左键、按 Shift 键可以单选,按下 Ctrl 可进行多选。
- 添加:点击左键
- 删除:点击右键,删除鼠标下的 item;当按下 Ctrl 选择多个 items 时,按下 Backspace 键,将选中的全部删除。
- 移动:点击左键,选择 item,然后移动鼠标;当按下 Ctrl 选择多个 items 时,可以移动选中的 items。
- 缩放:按 Alt 键,然后鼠标拖拽 item 的边界。
在对应操作的事件中,我们输出了一些调试信息,以便跟踪。
示例
效果
源码
custom_item.h:
#ifndef CUSTOM_ITEM_H
#define CUSTOM_ITEM_H
#include <QGraphicsRectItem>
#include <QGraphicsScene>
//QGraphicsScene管理QGraphicsItem(单击/选择/移动/缩放/删除)
// 自定义 Item
class CustomItem : public QGraphicsRectItem
{
public:
explicit CustomItem(QGraphicsItem *parent = 0);
protected:
// Shift+左键:进行选择 Alt:准备缩放
void mousePressEvent(QGraphicsSceneMouseEvent *event);
// Alt+拖拽:进行缩放 移动
void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
// 使item可使用qgraphicsitem_cast
int type() const;
private:
QPointF m_centerPointF;
bool m_bResizing;
};
// 自定义 Scene
class CustomScene : public QGraphicsScene
{
protected:
// 左键:添加item 右键:移除item
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void</