Qt应用程序中的奇怪错误

时间:2012-04-15 17:25:48

标签: c++ qt qgraphicsview qgraphicsitem

在我的应用程序中,我重新执行了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

我完全不知道是什么导致了这种情况以及为什么会发生这种情况。根据我过去的经验,我很确定这是一件很简单的事情,我愚蠢地没想到,但我无法弄清楚是什么。

真的很感激帮助。

2 个答案:

答案 0 :(得分:1)

如果LabelItem位于LayerItem之上,itemAt很可能会返回LabelItem,因为它是鼠标下的最顶层项目。除非LabelItem设置为不接受l->setAcceptedMouseButtons(0)的任何鼠标按钮。

尝试使用qgraphicsitem_cast来测试项目的类型。每个派生类必须重新定义QGraphicsItem::type(),以便为强制转换函数返回一个不同的值,以便能够识别该类型。

你也可以通过重新定义他们的QGraphicsItem::mouseReleaseEvent()方法来处理项目中的点击次数,它可以消除邪恶演员的需要,但是你必须删除函数LayerView::mouseReleaseEvent()或者至少回想一下基类实现QGraphicsView::mouseReleaseEvent(),允许项目接收事件。

答案 1 :(得分:0)

我已经看到了这些奇怪的行为:它主要是二进制不兼容 - c ++方面看起来是正确的,崩溃只是没有意义。正如您所说:在您的代码中,“选定”变量不是原因。您是否已更改声明并忘记重新编译所有链接对象。只需清理并重新编译所有目标文件即可。在99%的案例中为我工作。