我需要將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()
- 該信號是從我的理解每一個有任何形式的變化......時間實現
不知道我怎麼可以從那裏確定發生了什麼變化,它可能是非常重量級...
我添加到MyTextItem
:setFlags(QGraphicsItem::ItemSendsGeometryChanges);
但我不明白這將如何幫助。
編寫MyTextItem::itemChange()
函數......我仍然沒有看到如何從場景類中獲取信息。
在創建場景時,當我創建'connect'時,場景中沒有任何物體。在場景中可能有或沒有未定義數量的「MyTextObject」。我不知道在每種AddItem或Load函數上創建一個'connect'是否是一個有效的選項......我總是在構造函數中看到這些......可能有數百或數千個項目被創建和刪除,'connect'如何對此做出反應?刪除項目後,我是否會收到很多錯誤? – Thalia
我不確定我是否理解你,但爲了讓場景中有物體,你需要創建它們。我不知道你需要多少個MyTextObject,但是你可以創建它作爲場景類的_private_部分的指針。 –
當項目從場景中移除時,似乎'connect'指針被無縫刪除,並且在項目添加或加載時創建'connect'指針後,我沒有看到異常的負載,因此根據需要創建連接似乎沒問題。 – Thalia