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

时间:2015-08-25 15:40:58

标签: qt signals-slots qgraphicsitem qgraphicsscene

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

实际情况:

我已将QGraphicsScene和许多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");
}    

测试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()));

但我不知道对象会是什么......

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

现场是否已经知道此信号? (我的意思是,它是否包含在键盘/鼠标信号中?)

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

我看了QGraphicsScene::changed() - 每次有任何变化时,我都能理解这个信号...
不知道我怎么能从那里确定什么改变了,它可能是非常重的...... 我添加到MyTextItemsetFlags(QGraphicsItem::ItemSendsGeometryChanges);,但我不知道这会有什么帮助 编写MyTextItem::itemChange()函数...我仍然没有看到如何从场景类中获取信息。

1 个答案:

答案 0 :(得分:0)

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

回答你的一般问题: QGraphicsItem QGraphicsSceneQGraphicsItem发出信号的方式是将QGraphicsScene的信号与connect(graphicsItemObject, SIGNAL(graphicsItemSignal()), graphicsSceneObject, SLOT(graphicsSceneSlot())); 的广告连接起来。像这样:

{{1}}

我希望这可以帮到你一点点。