在我的应用程序中,我重新实现了QGraphicsView
检查mouseReleaseEvent()
,然后在鼠标所在的位置告诉该项目以处理事件。
我的视图的QGraphicsItem
由其他两个QGraphicsItems
组成,我检查了两者中的哪一个被单击(或释放了按钮),并处理了各自的事件。
在我的小部件的构造函数中,我使用与项目检测到发布时相同的方法,将其中一项设置为默认选中。
调试时,我发现对于LabelItem
,在构造函数中没有任何问题地调用了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
上。我完全不知道是什么原因引起的,以及为什么发生这种情况。从我过去的经验来看,我很确定这很简单,但我愚蠢地没想到,但是我不知道要做什么。
帮助将不胜感激。
最佳答案
如果LabelItem
在LayerItem
的顶部,则itemAt
很可能会返回LabelItem
,因为它是鼠标下的最上面的项目。除非LabelItem
设置为不接受l->setAcceptedMouseButtons(0)
的任何鼠标按钮。
尝试使用qgraphicsitem_cast
测试项目的类型。每个派生类都必须重新定义QGraphicsItem::type()
以返回一个不同的值,以便强制转换函数能够识别类型。
您还可以通过重新定义它们的QGraphicsItem::mouseReleaseEvent()
方法来处理项目本身中的单击,这将消除对邪恶的转换的需要,但是您必须删除函数LayerView::mouseReleaseEvent()
或至少调用基类实现QGraphicsView::mouseReleaseEvent()
,以允许商品接收事件。
关于c++ - Qt应用程序中的奇怪错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10164321/