QGraphicsItem如何使用信号/槽

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

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


继承自 QObject 和 QGraphicsItem

class CustomItem : public QObject, public QGraphicsItem
{
    Q_OBJECT

public:
    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();
    ...
};

继承自 QGraphicsObject

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

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

class CustomItem : public QGraphicsObject
{
    Q_OBJECT

public:
    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();
    ...
};

// .h
#ifndef CUSTOMITEM_H
#define CUSTOMITEM_H

#include <QObject>
#include <QGraphicsItem>

class CustomItem : public QObject, public QGraphicsItem
{
    Q_OBJECT
public:
    CustomItem(QGraphicsItem *parent = 0);
    ~CustomItem();
public slots:
    virtual void hello();
};

#endif // CUSTOMITEM_H


// .cpp
#include "include/customitem.h"

CustomItem::CustomItem(QGraphicsItem *parent)
{
}

CustomItem::~CustomItem()
{

}

void CustomItem::hello()
{

}

// 继承
class DemoItem : public CustomItem
{

}

DemoItem::DemoItem()
{
    QTimer *m_timer = new QTimer(this);
    // 这里的 hello 必须在父类定义好 ... 
    connect(m_timer, SIGNAL(timeout()), this, SLOT(hello()));
    m_timer->start(1000);
}

void DemoItem::hello()
{
    cout << "www.nljb.net" << endl;
}

部分摘自:https://blog.csdn.net/liang19890820/article/details/53643700 感谢