2010-11-23 4 views
7

QGraphicsView에 대한 사용자 지정 커서와 미리 설정된 커서를 혼합하여 사용하려고합니다. 내 구현에서는보기에 "모드"개념을 만들었습니다. 사용자가 어떤 모드에 있는지에 따라 왼쪽 클릭이나 왼쪽 클릭 드래그에서 다른 일이 일어날 것입니다. 어쨌든, 그 누구도 문제가 아니며 단지 맥락입니다.QGraphicsView 및 사용자 지정 커서

각 모드에서 커서를 변경하려고하면 문제가 발생합니다. 예를 들어 모드 1의 경우 일반적인 화살표 커서를 표시하려고하지만 모드 2의 경우 사용자 정의 pixmap을 사용하려고합니다. 모드 1로 전환 할 때는 graphicsview->viewport()->setCursor(Qt::QArrowCursor), 모드 2 인 경우 graphicsview->viewport()->setCursor(our custom cursor)으로 전화를 겁니다. 전혀 작동하지 않는 경우를 제외하고는 간단합니다.

먼저 커서는 사용자 정의 커서로 변경되지 않습니다. 이것이 첫 번째 문제입니다. 그러나 다른 작업을 통해 그래픽보기의 끌기 모드가 ScrollHandDrag로 설정되면 끌기 작업이 완료되면 커서가 사용자 정의 커서로 전환됩니다. 기묘한. 그러나 줄거리가 두꺼워졌습니다 ... 맞춤 커서로 전환하면 setCursor(Qt::QArrowCursor)에 몇 번이나 호출해도 상관없이 다시 ArrorCursor로 변경할 수 있습니다. 그것은 뷰포트에서 setCursor를 호출하는지 또는 그래픽 뷰 자체에서 호출하는지 여부도 중요하지 않습니다.

재미 있기 때문에 커서를 변경하기 직전에 graphicsview->unsetCursor()에 대한 호출을 추가했는데 두 번째 문제를 수정했습니다. 그 사이에 작은 HandDragging을하는 한 커서가 잘 바뀝니다. 더 좋지만 확실하지는 않습니다. 그러나 뷰포트에서 unsetCursor를 수행하면 작동하지 않습니다. 우리가 뷰포트에 커서를 설정하고 있다는 사실에 관계없이 그래픽 뷰에서 절대적으로 수행되어야합니다.

완전히 내가 커서를 설정 한 후 나는이 두 줄을 추가 한 문제를 통해 패치 :

graphicsview->setDragMode(QGraphicsView::ScrollHandDrag); 
graphicsview->setDragMode(QGraphicsView::NoDrag); 

작동하지만, 너희 GADS! 문제를 해결하는이 두 가지 방법에서 마술 같은 일이 일어나고 있습니다. 그러나 코드를 보면서 나는 무엇을 보지 못합니다. 드래그 모드가 상상하는 커서를 변경한다는 사실과 관련이 있습니다.

완전성을 위해 모드 변경을 트리거하는 것은 QGraphicsScene->addWidget()을 사용하여 장면에 추가 된 QPushButton입니다. 그게 그 일과 관련이 있는지 모르겠지만 결코 알지 못합니다.

누군가 내가이 겉으로보기에 무작위로 호출해야하는 이유를 분명히 밝힐 수 있기를 바랍니다. 나는 아무 것도 잘못하고 있다고 생각하지 않는다. 모든 도움을 미리 감사드립니다.

EDIT : 다음은 위에서 설명한 커서 패치가 적용된 실제 코드 예제입니다. 아래 링크에서 보거나 다운로드 할 수 있습니다. 여기에 붙여 넣기에는 약간 길었습니다. 필자는 커서가 변경된 프레임 워크를 포함 시켰습니다. 필자는 그것이 어떻게 든 중요하다는 재미있는 느낌을 갖기 때문입니다.

https://gist.github.com/712654

문제가 커서가 그래픽보기에 설정되어있는 곳입니다 MyGraphicsView.cpp 라인 (104)에서 시작에 놓여 코드입니다. 이것은 정확히 위에서 설명한 것과 같습니다.

매우 추악한 패치를 사용하면 커서가 작동합니다. 이러한 라인이 없으면 위의 게시물에 나열된 문제를 매우 분명하게 볼 수 있습니다.

또한 링크에 포함 된보기를 사용하는 mainWindow에 대한 모든 코드가 있습니다.누락 된 유일한 것은 내가 사용하고있는 이미지입니다. 그러나 이미지 자체는 중요하지 않습니다. 16x16 PNG가 수행 할 것입니다.

+2

그래픽보기 -> setCursor (...) 및 그래픽보기 ->보기 포트() -> setCursor (...)를 사용하면 유용합니다. 당신이 묘사 한 비정상적인 행동을 보여주는 최소한의 테스트 케이스를 제공 할 수 있습니까? –

+1

질문은 오래되었지만 미래의 독자들에게 커서 모양을 설정하기 위해 타이머를 사용하여 비슷한 제안으로 내 제안을 볼 수 있습니다. [link] (http://stackoverflow.com/questions/5254404/) 왜 마우스 커서가 인터랙티브 한 구현의 커서가 되었습니까? 5348648 # 5348648) –

+0

https : // bugreports와 관련된 문제로 인해 버그 보고서를 제출했습니다. qt.io/browse/QTBUG-60752 –

답변

4
나는 비슷한 문제를 해결하기 위해 museReleaseEvent 추가

은 ... 드래그 손 동안 완료 말이 통할 것입니다.

4

내 솔루션 :이 드래그 이벤트 후 커서를 재설정합니다

void mouseReleaseEvent(QMouseEvent *event) { 
    QGraphicsView::mouseReleaseEvent(event); 
    viewport()->setCursor(Qt::CrossCursor); 
} 

view->setDragMode(QGraphicsView::ScrollHandDrag); 
QApplication::setOverrideCursor(Qt::ArrowCursor);