在QGraphicsFramework中选择子项及其父项

时间:2016-10-22 17:37:54

标签: qt qgraphicsitem

我使用QGraphicsFramework在我的程序中实现了一个场景。 所以我有一个形状(父)和它的锚点(子)QGraphicsItem

Shape::Shape(QGraphicsItem *parent) :
    QGraphicsItem(parent)
{
    setFlags(ItemIsSelectable | ItemIsMovable | ItemSendsGeometryChanges);
    anchorPoint = new AnchorPoint(this);
    anchorPoint->setParentItem(this);
    anchorPoint->setVisible(false);
}

锚点项目通常是不可见的。但是当我选择我的形状时,我必须显示它的锚点,并因此在形状失去选择时隐藏它。 所以我把这个动作绑定到itemChange:

QVariant Shape::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
{
    switch(change)
    {
        case QGraphicsItem::ItemSelectedChange:
            anchorPoint->setVisible(value.toBool());
        break;
    }
    return QGraphicsItem::itemChange(change, value);
}

但是当我想移动锚点时会出现问题。如果我点击它,形状失去焦点,所以隐藏它的锚点,所以我无法移动它。有没有办法在父项保持选中时选择子项?

1 个答案:

答案 0 :(得分:1)

您可以在默认提供的内容之上定义您自己的isSelected属性(以及选择管理器,如果需要多个选择),在选择Shape时设置为true,如果另一个Shape设置为false,则定义为false被选中或单击空场景。锚点(不是Shape)在选择时不会导致取消选择父Shape。

通过这种方式,您可以在两个上下文中进行选择 - 场景选择的内容以及您选择的内容。我在QML中完成了这个并且它非常方便,但是,我将自定义选择称为焦点,使用对象的句柄更改选择而不是焦点,这对于具有额外调度程序的键盘事件非常有用。好吧,因为我假设您还希望Shape在选择锚点时接收键盘事件,而不是被锚点接收。