如何从场景子类访问 QGraphicsItem 的信号
How to access a signal of QGraphicsItem from scene subclass
我需要将 QGraphicsItem
subclass 发出的信号读入 QGraphicsScene
subclass。
实际情况:
我已经 class 编辑了我的 QGraphicsScene
和许多 QGraphicsItem
class。
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
时更新它的大小和位置。 (现在看到它的唯一方法是执行另一个强制刷新属性的操作 - 但我知道这有效)
如何在场景 class 级别传播它? (所以我得到即时更新)
我在文本项 class textItemHasChanged();
中创建了一个信号,但如何在场景 class 中连接它? (对象是什么?)
场景class...没什么特别的
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()));
但我不知道对象是什么...
由于用户在场景 class 中键入文本 (document().contentsChanged()
),我如何访问 MyTextItem
中的更改?
场景是否已经感知到这个信号? (我的意思是,它是否包含在 keyboard/mouse 信号中?)
或者更一般地说,我如何访问 QGraphicsScene
中的 QGraphicsItem
发出的信号?
我查看了 QGraphicsScene::changed()
- 该信号是根据我的理解实施的,每次有任何变化...
不确定我如何从那里确定发生了什么变化,它可能非常重量级...
我添加到 MyTextItem
:setFlags(QGraphicsItem::ItemSendsGeometryChanges);
但我看不出这会有什么帮助。
写MyTextItem::itemChange()
函数...我还是没看懂如何从场景class.
获取信息
该对象将是发送信号的对象,即 MyTextItem
对象。
并回答您的一般问题:
在 QGraphicsScene
中访问 QGraphicsItem
发出的信号的方法是将 QGraphicsItem
的信号与 QGraphicsScene
的插槽连接起来。像这样:
connect(graphicsItemObject, SIGNAL(graphicsItemSignal()), graphicsSceneObject, SLOT(graphicsSceneSlot()));
希望对您有所帮助。
我需要将 QGraphicsItem
subclass 发出的信号读入 QGraphicsScene
subclass。
实际情况:
我已经 class 编辑了我的 QGraphicsScene
和许多 QGraphicsItem
class。
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
时更新它的大小和位置。 (现在看到它的唯一方法是执行另一个强制刷新属性的操作 - 但我知道这有效)
如何在场景 class 级别传播它? (所以我得到即时更新)
我在文本项 class textItemHasChanged();
中创建了一个信号,但如何在场景 class 中连接它? (对象是什么?)
场景class...没什么特别的
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()));
但我不知道对象是什么...
由于用户在场景 class 中键入文本 (document().contentsChanged()
),我如何访问 MyTextItem
中的更改?
场景是否已经感知到这个信号? (我的意思是,它是否包含在 keyboard/mouse 信号中?)
或者更一般地说,我如何访问 QGraphicsScene
中的 QGraphicsItem
发出的信号?
我查看了 QGraphicsScene::changed()
- 该信号是根据我的理解实施的,每次有任何变化...
不确定我如何从那里确定发生了什么变化,它可能非常重量级...
我添加到 MyTextItem
:setFlags(QGraphicsItem::ItemSendsGeometryChanges);
但我看不出这会有什么帮助。
写MyTextItem::itemChange()
函数...我还是没看懂如何从场景class.
该对象将是发送信号的对象,即 MyTextItem
对象。
并回答您的一般问题:
在 QGraphicsScene
中访问 QGraphicsItem
发出的信号的方法是将 QGraphicsItem
的信号与 QGraphicsScene
的插槽连接起来。像这样:
connect(graphicsItemObject, SIGNAL(graphicsItemSignal()), graphicsSceneObject, SLOT(graphicsSceneSlot()));
希望对您有所帮助。