0

在我的应用程序中,我重新实现QGraphicsView了检查 a mouseReleaseEvent(),然后告诉鼠标所在位置的项目来处理事件。

我的QGraphicsItem视图由另外两个组成QGraphicsItems,我检查两个中的哪一个被单击(或者更确切地说是释放按钮),并处理相应的事件。

在我的 Widget 的构造函数中,我将其中一个项目设置为默认选中,使用的方法与项目检测到发布时使用的方法相同。

调试的时候,发现对于LabelItem, 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);
        }
   }
}

当我在函数中注释掉该行时,我没有错误。我还没有为另一个QGraphicsItemCheckBoxItem 进行调试,但应用程序也终止了它的事件。我认为这个问题可能是相关的,所以我现在专注于select

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

帮助真的很感激。

4

2 回答 2

1

如果LabelItem位于 顶部LayerItemitemAt则很可能会返回 ,LabelItem因为它是鼠标下方的最顶部项目。除非LabelItem设置为不接受任何带有 的鼠标按钮l->setAcceptedMouseButtons(0)

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

您还可以通过重新定义它们的方法来处理项目本身的点击QGraphicsItem::mouseReleaseEvent(),这将消除对邪恶演员的需要,但您必须删除该函数LayerView::mouseReleaseEvent()或至少调用基类实现QGraphicsView::mouseReleaseEvent(),以允许项目接收事件。

于 2012-04-16T00:52:45.903 回答
0

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

于 2012-04-15T19:01:55.180 回答