【发布时间】:2015-08-26 01:38:26
【问题描述】:
我需要将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()));
但我不知道对象会是什么......
由于用户在场景类中键入文本 (document().contentsChanged()),我如何访问 MyTextItem 中的更改?
现场是否已经意识到这个信号? (我的意思是,它是否包含在键盘/鼠标信号中?)
或者更一般地说,我如何在QGraphicsScene 中访问QGraphicsItem 发出的信号?
我查看了QGraphicsScene::changed() - 每次发生任何变化时,该信号都是根据我的理解实现的...
不知道如何从那里确定发生了什么变化,它可能非常重...
我添加到MyTextItem:setFlags(QGraphicsItem::ItemSendsGeometryChanges);,但我不知道这会有什么帮助。
写MyTextItem::itemChange()函数……还是没看懂怎么从场景类中获取信息。
【问题讨论】:
标签: qt signals-slots qgraphicsitem qgraphicsscene