我使用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);
}
但是当我想移动锚点时会出现问题。如果我点击它,形状失去焦点,所以隐藏它的锚点,所以我无法移动它。有没有办法在父项保持选中时选择子项?
答案 0 :(得分:1)
您可以在默认提供的内容之上定义您自己的isSelected
属性(以及选择管理器,如果需要多个选择),在选择Shape时设置为true,如果另一个Shape设置为false,则定义为false被选中或单击空场景。锚点(不是Shape)在选择时不会导致取消选择父Shape。
通过这种方式,您可以在两个上下文中进行选择 - 场景选择的内容以及您选择的内容。我在QML中完成了这个并且它非常方便,但是,我将自定义选择称为焦点,使用对象的句柄更改选择而不是焦点,这对于具有额外调度程序的键盘事件非常有用。好吧,因为我假设您还希望Shape在选择锚点时接收键盘事件,而不是被锚点接收。