gpt4 book ai didi

c++ - Qt 应用程序中的奇怪错误

转载 作者:行者123 更新时间:2023-11-28 08:06:40 25 4
gpt4 key购买 nike

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

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

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

当我调试时,我发现对于 LabelItem,从构造函数中调用 select 没有问题(当我第一次启动应用程序时结果很清楚)。但是,当我单击这些项目时,应用程序终止。我看到我正在进入选择功能,但没有离开它。所以问题就在这里。

这很奇怪,因为选择函数只是一个单行 setter 。

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

我完全不知道是什么原因造成的,也不知道为什么会这样。根据我过去的经验,我很确定这是我愚蠢地没有想到的简单事情,但我无法弄清楚是什么。

非常感谢您的帮助。

最佳答案

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

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

您还可以通过重新定义 QGraphicsItem::mouseReleaseEvent() 来处理项目本身的点击。方法,它会消除对邪恶 Actor 的需要,但你必须删除功能 LayerView::mouseReleaseEvent()或者至少记忆一下基类实现,QGraphicsView::mouseReleaseEvent() , 以允许项目接收事件。

关于c++ - Qt 应用程序中的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10164321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com