QGraphicsItem如何使用信号槽

发布时间:2018-10-02 02:12:39   来源:文档文库   
字号:

QGraphicsItem如何使用信号槽

简述

对于 QGraphicsItem 来说,信号/槽和属性机制不是它的一部分,因为它不继承自 QObject。这是一个出于性能考虑的设计决策,允许比较大的场景以及快速的交互。

特殊情况下,如果真的需要使用信号/槽,可以使用 QObject 的信号/槽和属性机制来扩展 QGraphicsItem。简述

继承自 QObject QGraphicsItem

继承自 QGraphicsObject

性能差异

继承自 QObject QGraphicsItem

这种方式属于多继承,也是最容易想到的方式。class CustomItem : public QObject, public QGraphicsItem

{

Q_OBJECTpublic:

explicit CustomItem(QGraphicsItem *parent = 0);

virtual QRectF boundingRect() const;

virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);Q_SIGNALS:

void mySignal();public Q_SLOTS:

void mySlot();

...

};12345678910111213141516

继承自 QGraphicsObject

QGraphicsObject 类为需要信号/槽和属性的所有 items 提供一个基类,将 QGraphicsItem 的许多基本 setters getters 映射到属性,并为其中的许多添加了通知信号。

由于 QGraphicsObject 继承自 QObject QGraphicsItem,所以,上述的自定义 item 可以变成这样:class CustomItem : public QGraphicsObject

{

Q_OBJECTpublic:

explicit CustomItem(QGraphicsItem *parent = 0);

virtual QRectF boundingRect() const;

virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);Q_SIGNALS:

void mySignal();public Q_SLOTS:

void mySlot();

...

};12345678910111213141516

这时,很多人会陷入一种误区,认为上述两种方式一样,而且“继承自 QGraphicsObject”更简单。真的是这样吗?不妨分析一下!

性能差异

正如上面所说,由于 QGraphicsObject 继承自 QObject QGraphicsItem,所以其拥有 QObject QGraphicsItem 的基本特性。除此之外,它还提供了额外的信号,例如:enabledChanged()opacityChanged()xChanged()yChanged() 等等。

也就是说,如果使用 QGraphicsObject,会有一些不感兴趣的信号自动发射。例如,调用 QGraphicsItem::setPos(),会执行以下代码:void QGraphicsItemPrivate::setPosHelper(const QPointF &pos)

{

Q_Q(QGraphicsItem);

inSetPosHelper = 1;

if (scene)

q->prepareGeometryChange();

QPointF oldPos = this->pos;

this->pos = pos;

dirtySceneTransform = 1;

inSetPosHelper = 0;

if (isObject) { // 额外的开销

if (pos.x() != oldPos.x())

emit static_cast(q_ptr)->xChanged();

if (pos.y() != oldPos.y())

emit static_cast(q_ptr)->yChanged();

}

}1234567891011121314151617

这时,QGraphicsObject 会有额外的开销(发射 xChanged()yChanged() 信号)。所以,性能如何?用事实说话!

虽然上述方式均继承自 QObject,来自 QObject 的内存开销不可避免,但 QGraphicsObject 效率明显更低,因为其有额外的信号,如果创建许多 QGraphicsObject,可能会显着影响性能。

原文:http://blog.csdn.net/liang19890820/article/details/53643700

博文索引 持续更新中。。。

本文来源:https://www.2haoxitong.net/k/doc/267d55ecf021dd36a32d7375a417866fb84ac0fc.html

《QGraphicsItem如何使用信号槽.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式