2012-04-15 5 views
0

내 응용 프로그램에서 mouseReleaseEvent()을 확인하고 이벤트를 처리 할 위치에있는 항목을 알려주는 내용으로 다시 구현했습니다 (QGraphicsView).Qt 응용 프로그램의 이상한 버그

내보기의 QGraphicsItem은 다른 두 개의 QGraphicsItems으로 구성되어 있으며 둘 중 어느 쪽을 클릭했는지 (또는 버튼을 놓은 상태로) 확인하고 해당 이벤트를 처리합니다.

내 위젯의 생성자에서 아이템이 출시를 감지 할 때 사용한 것과 동일한 방법을 사용하여 기본적으로 선택한 항목 중 하나를 설정합니다.

내가 디버그했을 때, LabelItem에 대해 select가 생성자에서 문제없이 호출되었으며 (처음 응용 프로그램을 시작할 때 결과가 분명 함) 발견되었습니다. 그러나 항목을 클릭하면 응용 프로그램이 종료됩니다. 내가 select 함수로 들어가는 것을 보았지만 그것을 남기지 않았다. 문제는 여기에 있습니다.

select 기능이 단지 한 줄 짜리기이기 때문에 매우 이상합니다.

void LabelItem::select() 
{ 
    selected = true; 
} 

이것은 입니다.

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

'mouseReleaseEvent()'함수의 코드를 보여줄 수 있습니까? – alexisdm

+0

null 또는 유효하지 않은'this' 포인터를 역 참조하려고하는 경우이 동작이 발생합니다. 내 말은, null 또는 유효하지 않은 객체에 대해'select'를 호출 할 수 있으며 할당에서'this'를 참조 해제 할 수 있습니다. – Lol4t0

답변

1

, itemAt은 가능성이 가장 높은 LabelItem를 반환합니다. LabelIteml->setAcceptedMouseButtons(0) 인 마우스 버튼을 수락하지 않도록 설정하지 않은 한.

qgraphicsitem_cast을 사용하여 항목 유형을 테스트 해보십시오. 파생 된 각 클래스는 유형을 식별 할 수 있도록 형변환 함수에 고유 한 값을 반환하려면 QGraphicsItem::type()을 다시 정의해야합니다.

당신은 또한 QGraphicsItem::mouseReleaseEvent() 방법을 재정 의하여 상품 자체의 클릭을 처리 할 수있는, 그것은 악한 캐스트에 대한 필요성을 제거하는 것입니다,하지만 당신은에, 이상은 기본 클래스 구현, QGraphicsView::mouseReleaseEvent()을 불러 LayerView::mouseReleaseEvent() 또는 기능을 제거해야 항목이 이벤트를 수신하도록 허용하십시오.

+0

효과가있었습니다! 나는'QGraphicsView'가'QGraphicsItem'과 어떻게 상호 작용하는지에 대한 이해가 부족했고, 단순히 내가 추가했던 항목 인'LayerItem'을 얻는다 고 가정했습니다. 그러나 내가 얻고있는 항목은 실제로'LabelItem'입니다. 보여주기 위해 문서를 더 자세히 읽어야합니다. 도와 주셔서 정말로 고맙습니다! – Rikonator

0

저는 이상한 행동을 보았습니다. 대부분 바이너리 비 호환성이었습니다. C++ 측이 올바르게 보이고 충돌이 의미가 없습니다. 명시한대로 : 코드에서 "선택한"변수가 원인 일 수 없습니다. 선언을 변경하고 링크 된 모든 객체를 다시 컴파일하는 것을 잊어 버렸습니까? 모든 오브젝트 파일을 정리하고 다시 컴파일하십시오. 케이스의 99 %에서 저를 위해 일했습니다. LabelItemLayerItem의 상단에있는 경우는 마우스 아래의 맨 위의 아이템이기 때문에

+0

원본에서 처음부터 완전히 다시 작성했지만 동일한 문제가 발생합니다. 내 질문에 주석에 요청 된 코드를 게시하고 누군가가 버그를 이해할 수 있는지 확인합니다. – Rikonator