在我的应用程序中,我重新执行了QGraphicsView
检查mouseReleaseEvent()
,然后告诉鼠标所在位置的项目来处理事件。
我视图的QGraphicsItem
由另外两个QGraphicsItems
组成,我检查两个中的哪一个被点击(或者更确切地说是释放了按钮),并处理相应的事件。
在我的Widget的构造函数中,我设置了一个默认选择的项目,使用的方法与项目检测到版本时使用的方法相同。
当我调试时,我发现对于LabelItem
,从构造函数调用select时没有问题(当我第一次启动应用程序时结果很清楚)。但是,当我单击项目时,应用程序终止。我看到我进入了select函数,但没有离开它。问题出在这里。
这很奇怪,因为select函数只是一个单行设置器。
void LabelItem::select()
{
selected = true;
}
这是mouseReleaseEvent
;
void LayerView::mouseReleaseEvent(QMouseEvent *event)
{
LayerItem *l;
if(event->button() == Qt::LeftButton)
{
l = (LayerItem *) itemAt(event->pos());
if(l->inLabel(event->pos()))
{ //No problem upto this point, if label is clicked on
l->setSelection(true); //in setSelection, I call select() or unselect() of LabelItem,
//which is a child of LayerItem, and the problem is there.
//In the constructor for my main widget, I use setSelection
//for the bottom most LayerItem, and have no issues.
emit selected(l->getId());
}
else if(l->inCheckBox(event->pos()))
{
bool t = l->toggleCheckState();
emit toggled(l->getId(), t);
}
}
}
当我在函数中注释掉行时,我没有错误。我没有调试其他QGraphicsItem
,CheckBoxItem,但应用程序也终止了它的事件。我认为问题可能是相关的,所以我现在专注于select
。
我完全不知道是什么导致了这种情况以及为什么会发生这种情况。根据我过去的经验,我很确定这是一件很简单的事情,我愚蠢地没想到,但我无法弄清楚是什么。
真的很感激帮助。
答案 0 :(得分:1)
如果LabelItem
位于LayerItem
之上,itemAt
很可能会返回LabelItem
,因为它是鼠标下的最顶层项目。除非LabelItem
设置为不接受l->setAcceptedMouseButtons(0)
的任何鼠标按钮。
尝试使用qgraphicsitem_cast
来测试项目的类型。每个派生类必须重新定义QGraphicsItem::type()
,以便为强制转换函数返回一个不同的值,以便能够识别该类型。
你也可以通过重新定义他们的QGraphicsItem::mouseReleaseEvent()
方法来处理项目中的点击次数,它可以消除邪恶演员的需要,但是你必须删除函数LayerView::mouseReleaseEvent()
或者至少回想一下基类实现QGraphicsView::mouseReleaseEvent()
,允许项目接收事件。
答案 1 :(得分:0)
我已经看到了这些奇怪的行为:它主要是二进制不兼容 - c ++方面看起来是正确的,崩溃只是没有意义。正如您所说:在您的代码中,“选定”变量不是原因。您是否已更改声明并忘记重新编译所有链接对象。只需清理并重新编译所有目标文件即可。在99%的案例中为我工作。