您说您的子项目没有收到鼠标事件,但它们确实收到了。您可以通过添加一个来验证这一点void mousePressEvent(QGraphicsSceneMouseEvent * event)
到 Vertice 并注意到它被调用。
你的问题是 Qt 忽略了ItemIsMovable
子 QGraphicsItem 上的标志。当你询问时它甚至没有设置标志。
您可以通过更改 Vertice 构造函数来验证这一点:
Vertice::Vertice(QGraphicsItem * parent) :
QGraphicsItem(parent)
{
setFlag(ItemIsMovable);
Q_ASSERT(flags() & ItemIsMovable); // fails
setFlag(ItemIsSelectable);
setFlag(ItemSendsGeometryChanges);
}
为什么会这样呢?正如编程绝地所说:“使用源头,卢克!”
https://qt.gitorious.org/qt/qtbase/source/7df3321f934e5bd618e2ad00bf801f2b7edd31df:src/widgets/graphicsview/qgraphicsitem.cpp#L1789 https://qt.gitorious.org/qt/qtbase/source/7df3321f934e5bd618e2ad00bf801f2b7edd31df:src/widgets/graphicsview/qgraphicsitem.cpp#L1789
请注意,设置标志时它所做的事情之一是它提供了itemChange
检查用ItemFlagsChange
通知。不仅如此,它还允许该调用的结果覆盖标志。但是看看 Vertice 上 itemChange() 的实现:
QVariant Vertice::itemChange(GraphicsItemChange change, const QVariant & value)
{
switch(change) {
case QGraphicsItem::ItemSelectedHasChanged:
qWarning() << "vertex: " + value.toString(); // never happened
break;
default:
break;
}
}
呃哦。无返回结果!将此行添加到末尾,就像您在项目中一样:
return QGraphicsItem::itemChange(change, value);
...你就得到了它。其他注意事项:
“顶点”的单数形式实际上是“顶点” https://english.stackexchange.com/questions/4539/singular-of-vertices
如果您遇到这样的情况,请考虑将其从您正在编写的任何特定程序中删除。如果您可以用一个子项和一个父项来演示该问题,那么为什么要使用一个循环来生成四个呢?如果选择不是问题的一部分——并且不需要涉及隐藏和显示顶点的代码——那么为什么要涉及它呢?最好使用您提供的代码来提供所需的虚拟方法,例如boundingRect()
而不是让别人写出来测试。看简短、独立、可编译的示例 http://sscce.org/
Qt 源代码具有相当的可读性并且组织良好,因此请养成查看它的习惯......!