【问题标题】:How to access a signal of QGraphicsItem from scene subclass如何从场景子类访问 QGraphicsItem 的信号
【发布时间】: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() - 每次发生任何变化时,该信号都是根据我的理解实现的...
不知道如何从那里确定发生了什么变化,它可能非常重...
我添加到MyTextItemsetFlags(QGraphicsItem::ItemSendsGeometryChanges);,但我不知道这会有什么帮助。
MyTextItem::itemChange()函数……还是没看懂怎么从场景类中获取信息。

【问题讨论】:

    标签: qt signals-slots qgraphicsitem qgraphicsscene


    【解决方案1】:

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

    并回答您的一般问题: 在QGraphicsScene 中访问QGraphicsItem 发出的信号的方法是将QGraphicsItem 的信号与QGraphicsScene 的插槽连接起来。像这样的:

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

    希望对你有所帮助。

    【讨论】:

    • 在创建场景时,当我创建connect 时,场景中没有对象。现场可能有也可能没有未定义数量的MyTextObject。我不知道在每种AddItemLoad 函数上创建connect 是否是一个有效的选项......我总是在构造函数上看到这些......可能有成百上千的项目正在创建和删除,“连接”对此有何反应?删除项目后不会出现很多错误吗?
    • 我不确定我是否理解你的意思,但为了在场景中拥有对象,你需要创建它们。我不知道您需要多少 MyTextObject,但您可以在场景类的 private 部分中将其创建为指针。
    • 似乎connect指针在从场景中移除项目时被无缝删除,并且在项目添加或加载上创建connect指针后我没有看到异常加载,所以看起来没问题根据需要创建连接。
    • 大声笑确实要在场景中有对象,我必须创建它们。此外,要创建对象(或加载保存的对象),我必须在场景类的 PUBLIC SECTION 中有 PUBLIC SLOTS。为了连接对象发出的一些信号,我需要将信号连接到对象。我的困惑是基于这样一个事实,即我通常在构造函数上创建连接,而不是不断添加和删除它们。我希望在scene() 中已经实现了一些机制来监听项目的变化。但是……那个机制似乎很复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2015-04-17
    • 2014-05-24
    • 2018-04-15
    • 1970-01-01
    • 2012-12-19
    • 2014-09-20
    相关资源
    最近更新 更多