2014-03-24 19 views
0

QGraphicsView::fitInView()似乎忽略了滾動條的存在,顯然它們是重疊的。 (它也使用硬編碼的2像素邊距。)Qt QGraphicsScene不適合使用滾動條的InView()

有一個相關的錯誤報告(https://bugreports.qt-project.org/browse/QTBUG-1047)指出,調用fitInView()兩次可以解決問題。

在我的情況下,它沒有。只有手動觸發兩次才適合滾動條。這是行不通的:

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 4.8.1與MSVC2010

回答

2

調用fitInView()兩次的工作,但你必須讓Qt的過程中它的兩個電話之間的事件。

這也意味着你最終重繪圖形視圖兩次。

爲了避免這種情況,我做的是:

  1. 禁用更新
  2. 呼叫fitInView
  3. 呼叫的QApplication :: processEvents()
  4. 呼叫fitInView再次
  5. 啓用更新

在你的代碼中看起來像這樣:

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的bug跟蹤它投去了其優先級。

簡而言之,fitInView具有硬編碼的邊距,這可能會導致各種破壞 - 其中最小的是現在你失去了幾個像素的顯示區域,也可能會強制不必要的重新縮放。它可能導致失控的調整大小和奇怪的不穩定性,如QTBUG-1047錯誤提交者描述的內容。

您可以通過重新實現fitInView來解決問題,基於現有的實現,但刪除它的可笑邊緣。這方面的一個例子可以在這裏找到在蟒蛇,在原有基礎上C++版本:

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

讓我知道它是否修復您的問題!那樣我們可以從2007年的bug中關閉這個。