Qt 如何从场景子类访问QGraphicsItem的信号

Qt 如何从场景子类访问QGraphicsItem的信号,qt,signals-slots,qgraphicsitem,qgraphicsscene,Qt,Signals Slots,Qgraphicsitem,Qgraphicsscene,我需要将QGraphicsItem子类发出的信号读入qgraphicscene子类 实际情况: 我对我的qgraphicscene和许多QGraphicsItem类进行了子类化 MyScene有很多属性,反映了所包含的QGraphicsItems的变化,包括项目大小和位置 MyTextItem看起来有点像这样: .h class MyTextItem : public QGraphicsTextItem { Q_OBJECT public: MyTextItem(); ~MyTe

我需要将
QGraphicsItem
子类发出的信号读入
qgraphicscene
子类

实际情况:

我对我的
qgraphicscene
和许多
QGraphicsItem
类进行了子类化

MyScene
有很多属性,反映了所包含的
QGraphicsItems
的变化,包括项目大小和位置

MyTextItem
看起来有点像这样:

.h
class MyTextItem : public QGraphicsTextItem
{
Q_OBJECT
public:
    MyTextItem();
    ~MyTextItem() {}
    QSizeF getItemSize() const { return m_size; }
    void setItemSize(const QSizeF s) { m_size = s; }
signals:
    void textItemHasChanged();
private slots:
    void updateItemOnContentsChanged();
private:
    void updateTextOnPropertyChanges();
    QSizeF m_size;
};

.cpp
MyTextItem::MyTextItem()
{
    setTextInteractionFlags(Qt::TextEditorInteraction);
    connect(document(), SIGNAL(contentsChanged()), this, SLOT(updateItemOnContentsChanged()));
}
void MyTextItem::updateItemOnContentsChanged()
{
    updateTextOnPropertyChanges();
    emit textItemHasChanged();
}
void MyTextItem::updateTextOnPropertyChanges()
{
    qDebug("updating things like size or position");
}    
connect(graphicsItemObject, SIGNAL(graphicsItemSignal()), graphicsSceneObject, SLOT(graphicsSceneSlot()));
测试
MyTextItem
我可以在键入
QGraphicsTextItem
时更新其大小和位置。(现在查看它的唯一方法是执行另一个强制刷新属性的操作,但我知道这是可行的)

如何在场景类级别传播此信息?(因此我可以即时获得更新)

我在我的文本项类
textItemHasChanged()中创建了一个信号,但如何在场景类中连接它?(目标是什么?)

场景类。。。没什么特别的

class MyScene : public QGraphicsScene
{
    Q_OBJECT

public:
    MyScene (const qreal w = 300, const qreal h = 200, QObject* parent = 0);
    ~MyScene() {}
    // item add functions, item property functions, mouse overides
};

MyScene::MyScene(const qreal w, const qreal h, QObject *parent)
{
    setSceneRect(0, 0, w, h);
    connect(this, SIGNAL(selectionChanged()), this, SLOT(onSceneSelectionChanged()));
}
我想补充一点

    connect(???????, SIGNAL(textItemHasChanged()), this, SLOT(onSelectedItemsSizeChanged()));
但我不知道目标是什么

由于用户从场景类键入文本(
document().contentsChanged()
),如何访问
MyTextItem
中的更改

现场已经意识到这个信号了吗?(我的意思是,它是否包含在键盘/鼠标信号中?)

或者更一般地说,如何访问
qgraphicscene
中的
QGraphicsItem
发出的信号

我查看了
qgraphicscene::changed()
-该信号是根据我所理解的每次发生任何变化时实现的…
我不确定如何从中确定发生了什么变化,而且可能非常沉重……
我添加到
MyTextItem
setFlags(QGraphicsItem::ItemSendsGeometryChanges)但我看不出这有什么帮助。

正在编写
MyTextItem::itemChange()
函数。。。我仍然不知道如何从scene类获取信息。

对象将是发送信号的对象,即
MyTextItem
对象

并回答你的一般性问题: 在
qgraphicscene
中,访问由
qgraphicsceem
发出的信号的方法是将
qgraphicscene
的信号与
qgraphicscene
的插槽连接。大概是这样的:

.h
class MyTextItem : public QGraphicsTextItem
{
Q_OBJECT
public:
    MyTextItem();
    ~MyTextItem() {}
    QSizeF getItemSize() const { return m_size; }
    void setItemSize(const QSizeF s) { m_size = s; }
signals:
    void textItemHasChanged();
private slots:
    void updateItemOnContentsChanged();
private:
    void updateTextOnPropertyChanges();
    QSizeF m_size;
};

.cpp
MyTextItem::MyTextItem()
{
    setTextInteractionFlags(Qt::TextEditorInteraction);
    connect(document(), SIGNAL(contentsChanged()), this, SLOT(updateItemOnContentsChanged()));
}
void MyTextItem::updateItemOnContentsChanged()
{
    updateTextOnPropertyChanges();
    emit textItemHasChanged();
}
void MyTextItem::updateTextOnPropertyChanges()
{
    qDebug("updating things like size or position");
}    
connect(graphicsItemObject, SIGNAL(graphicsItemSignal()), graphicsSceneObject, SLOT(graphicsSceneSlot()));

我希望这能对您有所帮助。

在场景创建时,当我创建
连接时,场景中没有对象。场景中可能有或可能没有未定义数量的
MyTextObject
。我不知道在每种
AddItem
Load
功能上创建
connect
是否有效。。。我一直在施工人员身上看到这些。。。可能有成百上千的项目被创建和删除,“连接”对此有何反应?删除项目后不会出现很多错误吗?我不确定是否理解您的意思,但为了在场景中拥有对象,您需要创建它们。我不知道您需要多少
MyTextObject
,但您可以在场景类的私有部分将其创建为指针。当项目从场景中删除时,
connect
指针似乎会被无缝删除,在项目添加或加载时创建
connect
指针后,我没有看到异常加载,因此,根据需要创建连接似乎是可以的。哈哈,要在场景中创建对象,我必须创建它们。此外,要创建对象(或加载保存的对象),我必须在场景类的“公共”部分中具有公共插槽。为了连接物体发出的信号,我需要将信号连接到物体上。我的困惑是基于这样一个事实:通常我在构造函数上创建连接,而不是不断地添加和删除它们。我希望在侦听项目更改的
scene()
中已经实现了某种机制。但是这一机制似乎非常复杂。