2012-06-08 4 views
4

ScrollHandDrag이 켜져있는 동안 QGraphicsView의 커서를 변경하려고하는데 작동하지 않는 것 같습니다.QGraphicsView의 커서 변경

: 나는 ScrollHandDrag을 해제하지만이 활성화있는 동안, 나는 아마도 잘못된 일을 할 수 있는지 볼 수 없습니다하지 않을 경우 나는

울부 짖는 문제를 재현하는 코드의 일부입니다 ... 커서를 변경할 수 있습니다

QApplication app(argc, argv); 
QGraphicsScene scene; 
QRect rectangle(-8, -4, 100, 100); 
QPen pen(Qt::blue, 1, Qt::SolidLine); 
scene.addRect(rectangle, pen); 
scene.setBackgroundBrush(Qt::white); 
QGraphicsView vue(&scene); 
vue.setFixedSize(250, 250); 
//vue.setDragMode(QGraphicsView::ScrollHandDrag); 
vue.setCursor(Qt::CrossCursor); 
vue.show(); 

return app.exec(); 

답변

7

QGraphicsView 자동으로 끄는 동안 커서를 변경됩니다,하지만 당신은 쉽게 몇 가지 기능을 재 구현하여이 문제를 해결할 수 있습니다

class CoolView : public QGraphicsView 
{ 
protected: 
    void enterEvent(QEvent *event) 
    { 
     QGraphicsView::enterEvent(event); 
     viewport()->setCursor(Qt::CrossCursor); 
    } 

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

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

커서를 기본값으로 설정하는 기능이 있습니까? 나는 이와 같은 것을 시도했다 : void MyQGraphicsView :: mouseReleaseEvent (QMouseEvent * event) { QGraphicsView :: mouseReleaseEvent (event); 경우 (m_click) { 뷰포트() -> setCursor()에 (Qt는 :: CrossCursor); } else { viewport() -> unsetCursor(); } }'내가 기대하는 손 모양의 커서 대신 화살표 커서가 있습니다. 내 질문은 : 나는 모든 다른 커서를 설정해야합니까 아니면 그냥 setCursor를 취소 할 수있는 함수가 무엇입니까? – Leo

+1

@Leo'enterEvent'를 완전히 주석 처리 한 다음'mouseReleaseEvent'를'viewport() -> setCursor (Qt :: OpenHandCursor);'로 바꿀 수 있습니다. – Anthony

+0

좋은 해결 방법 – Chris

2

Qt의 소스 코드를 파고 들자 마자 끌기 모드로 들어가면 커서를 제어하는 ​​것처럼 보이므로 시도를 막을 수는 없습니다.

알고있는 유일한 해결책은 QApplication::setOverrideCursor()QApplication::restoreOverrideCursor()을 사용하여 커서를 전역으로 설정하는 것입니다. 안타깝게도 마우스 커서가 QGraphicsView에 들어가거나 떠날 때 많은 관리 작업을해야한다는 것을 의미합니다. 전체 응용 프로그램이 어디서나 같은 커서로 멈추지 않도록하는 것입니다.

또한 커서가 뷰포트 수준에서 설정되어 있는지 주목할 필요가, 그래서 vue.viewport()->setCursor(Qt::CrossCursor)

참조 설명서를 할 약간 더 적절할 것 :

QApplication::setOverrideCursor

QApplication::restoreOverrideCursor

QApplication::changeOverrideCursor

+0

이 좋아, 답변 주셔서 감사합니다. 또한 당신이 그 커서를 관리하는 방법에 대한 어떤 방향으로 나를 가르 킬 수 있다면, 또는 저에게 많은 가치가있을만한 가치가있는 읽을 거리를 연결하십시오! – Leo