2014-03-24 2 views
0

QGraphicsView::fitInView()은 스크롤 막대의 존재를 무시한 것처럼 보입니다.Qt QGraphicsScene은 스크롤바와 함께 fitInView()를 사용하지 않습니다.

fitInView()를 두 번 호출하면 문제가 해결된다는 관련 버그 보고서 (https://bugreports.qt-project.org/browse/QTBUG-1047)가 있습니다.

제 경우에는 그렇지 않습니다. 두 번 수동으로 스크롤하면 스크롤 막대를 수동으로 맞출 수 있습니다. 작동하지 않습니다.

void myGraphicsView::mousePressEvent(QMouseEvent *event) { 
    if(event->button() == Qt::LeftButton) { 
    QGraphicsItem* clicked = scene()->itemAt(mapToScene(event->pos())); 
    qDebug() << clicked << clicked->boundingRect(); 
    fitInView(clicked, Qt::KeepAspectRatio); 
    fitInView(clicked, Qt::KeepAspectRatio); // doesn't work for me 
    QGraphicsView::mousePressEvent(event); 
    return; 
    } 
} 

다른 해결 방법이 있습니까?

는 Qt는 두 번 작업을 수행 MSVC2010

답변

2

fitInView()를 호출하여 4.8.1,하지만 당신은 두 통화 사이의 Qt는 공정의 이벤트를 수 있도록해야합니다.

이렇게하면 그래픽보기를 두 번 다시 그려야합니다. 이 문제를 방지하려면

, 내가 할 것입니다 :

  1. 해제 업데이트
  2. 전화 fitInView
  3. 통화의 QApplication :: processEvents()
  4. 전화가 다시
  5. 업데이트를 사용 fitInView

코드에 다음과 같이 표시됩니다.

bool updateState = updatesEnabled(); 
setUpdatesEnabled(false); 
fitInView(clicked, Qt::KeepAspectRatio); 
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); 
fitInView(clicked, Qt::KeepAspectRatio); 
setUpdatesEnabled(updateState); 
0

원인이 (가 버그 리포트에 같은 최소한 보이는) 수 : https://bugreports.qt.io/browse/QTBUG-42331 - 우선 순위까지에 Qt는 버그 추적기에 투표하십시오.

간단히 말해서 fitInView는 여백을 하드 코드하여 모든 종류의 혼란을 야기 할 수 있습니다. 그 중 가장 작은 것은 표시 영역의 몇 픽셀을 잃어 버리며 불필요한 크기 재조정을 강제 할 수 있습니다. QTBUG-1047 버그 제출자의 설명과 같은 불안정한 크기 변경과 런 어웨이 변경이 발생할 수 있습니다.

기존 구현을 기반으로 fitInView를 다시 구현하지만 우스운 여백을 제거하여 문제를 해결할 수 있습니다. 그 예는 원래 C++ 버전을 기반으로, 파이썬 여기에 있습니다 :

https://github.com/nevion/pyqimageview/blob/master/qimageview/widget.py#L276

그것이 문제를 해결되는지 알려주세요! 그런 식으로 우리는 2007 년 이후의 버그도 없앨 수 있습니다.

관련 문제