博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QGraphicsItem的类型检测与转换
阅读量:6001 次
发布时间:2019-06-20

本文共 2405 字,大约阅读时间需要 8 分钟。

简述

由于 QGraphicsScene 和 QGraphicsItem 的大多数便利函数例如items()selectedItems()、collidingItems()、childItems()返回一个 QList<QGraphicsItem *> 列表在遍历列表的时候通常需要对其中的 QGraphicsItem 进行类型检测与转换以确定实际的 item。

类型检测

QGraphicsItem 中包含两个与类型相关的枚举值

enum {    Type = 1,    UserType = 65536};

QGraphicsItem::Type

QGraphicsItem::Type 是标准 item 类中 virtual type() 函数返回的类型值。所有标准 item 与唯一的 Type 值相关联。例如QGraphicsPathItem::type() 返回的值为 2。

class QGraphicsPathItem : public QAbstractGraphicsShapeItem{public:    enum { Type = 2 };    int type() const { return Type; }    ...};

其他标准 item 类似Type 分别为 3、4、5……

QGraphicsItem::UserType

QGraphicsItem::UserType 是自定义 itemQGraphicsItem 或任何标准 item 的子类的最小允许类型值。该值与 QGraphicsItem::type() 的重新实现结合使用并声明一个 Type 枚举值。例如

class CustomItem : public QGraphicsItem{public:    enum { Type = UserType + 1 };    int type() const    {        // 针对该 item 启用 qgraphicsitem_cast        return Type;    }    ...};

注意要使 qgraphicsitem_cast 与自定义 item 一起正常工作需要为其重新实现 type() 函数。

类型转换

T qgraphicsitem_cast(QGraphicsItem *item)

如果 item 是类型 T返回指定 item 转换为类型 T否则返回 0。

template 
inline T qgraphicsitem_cast(const QGraphicsItem *item){ typedef typename QtPrivate::remove_cv
::type>::type Item; return int(Item::Type) == int(QGraphicsItem::Type) || (item && int(Item::Type) == item->type()) ? static_cast
(item) : 0;}

实际应用

下面以获取 QGraphicsScene 中的所有 items 为例

QList
items = scene->items();foreach (QGraphicsItem *item, items) { if (item->type() == QGraphicsRectItem::Type) { // 矩形 QGraphicsRectItem *rect = qgraphicsitem_cast
(item); // 访问 QGraphicsRectItem 的成员 } else if (item->type() == QGraphicsLineItem::Type) { // 直线 QGraphicsLineItem *line = qgraphicsitem_cast
(item); // 访问 QGraphicsLineItem 的成员 } else if (item->type() == QGraphicsProxyWidget::Type) { // 代理 Widget QGraphicsProxyWidget *proxyWidget = qgraphicsitem_cast
(item); QLabel *label = qobject_cast
(proxyWidget->widget()); // 访问 QLabel 的成员 } else if (item->type() == CustomItem::Type) { // 自定义 Item CustomItem *customItem = qgraphicsitem_cast
(item); // 访问 CustomItem 的成员 } else { // 其他类型 item }}

首先根据 type() 判断 item 的类型。然后通过 qgraphicsitem_cast 进行转换。这样既可以访问标准 item也可以通过 QGraphicsProxyWidget 访问 QWidget以及访问自定义 item。

转载地址:http://escmx.baihongyu.com/

你可能感兴趣的文章
[转]对于C语言中指针和数组的认识和看法
查看>>
想写程序吗?远离你的计算机!
查看>>
PMP认证
查看>>
JSON 序列化 与反序列化
查看>>
(Excel)常用函数公式及操作技巧之四:文本与页面设置(五)
查看>>
mschart用法
查看>>
[转载]Parallel的使用
查看>>
IOS NSString to Char,char to nsstring, string compare
查看>>
sqlserver游标使用
查看>>
一些知识点的初步理解_6(核函数,ing...)
查看>>
printk
查看>>
Ubuntu 11.10安装splinter
查看>>
Across the universe
查看>>
Poco::Crypto--加解密(RSA)
查看>>
Spring AOP中pointcut expression表达式解析
查看>>
JavaScript中支持正则表达式的方法汇总
查看>>
使用Zend_Auth和Zend_Acl进行登录认证及根据用户角色进行权限控制
查看>>
PS网页设计教程XV——如何在Photoshop中创建一个充满活力的作品集的网页设计
查看>>
八皇后问题N种解法
查看>>
关于看图工具的几点想法
查看>>