2015-08-25 65 views
0

我需要將QGraphicsItem子類發出的信號讀入QGraphicsScene子類。如何從場景子類訪問QGraphicsItem的信號

實際情況:

我有我的子類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())); 

但我不知道對象是什麼。 ..

由於用戶從場景類輸入文字(document().contentsChanged()),我如何訪問MyTextItem中的更改?

現場是否已經知道這個信號? (我的意思是,是否包含在鍵盤/鼠標信號中?)

或者更一般的,我如何訪問QGraphicsItem發出的信號,在QGraphicsScene

我看着QGraphicsScene::changed() - 該信號是從我的理解每一個有任何形式的變化......時間實現
不知道我怎麼可以從那裏確定發生了什麼變化,它可能是非常重量級...
我添加到MyTextItemsetFlags(QGraphicsItem::ItemSendsGeometryChanges);但我不明白這將如何幫助。
編寫MyTextItem::itemChange()函數......我仍然沒有看到如何從場景類中獲取信息。

回答

0

該對象將是發送該信號的對象,即MyTextItem對象。

,並回答您的一般問題: 您可以訪問由QGraphicsItem發出的信號,在QGraphicsScene的方式與QGraphicsScene的插槽連接QGraphicsItem的信號。就像這樣:

connect(graphicsItemObject, SIGNAL(graphicsItemSignal()), graphicsSceneObject, SLOT(graphicsSceneSlot())); 

我希望這可以幫助你一點點。

+0

在創建場景時,當我創建'connect'時,場景中沒有任何物體。在場景中可能有或沒有未定義數量的「MyTextObject」。我不知道在每種AddItem或Load函數上創建一個'connect'是否是一個有效的選項......我總是在構造函數中看到這些......可能有數百或數千個項目被創建和刪除,'connect'如何對此做出反應?刪除項目後,我是否會收到很多錯誤? – Thalia

+0

我不確定我是否理解你,但爲了讓場景中有物體,你需要創建它們。我不知道你需要多少個MyTextObject,但是你可以創建它作爲場景類的_private_部分的指針。 –

+0

當項目從場景中移除時,似乎'connect'指針被無縫刪除,並且在項目添加或加載時創建'connect'指針後,我沒有看到異常的負載,因此根據需要創建連接似乎沒問題。 – Thalia