2013-08-22 34 views
3

我試圖將我的內容(拉伸)適合我的QDeclarativeView中的一個問題。我用通用的方式加載QML文件。我用下面的代碼重寫了showEvent和resizeEvent方法:Qt 4.8.5 QGraphicsView :: fitInView無法精確匹配

QGraphicsItem* rootItem = this->scene()->items.at(0); 
QRectF rootRect = rootItem->sceneBoundingRect(); // it gives me a QRectF(0,0,1920,1080) 
this->fitInView(rootRect, Qt::IgnoreAspectRatio); // Aspect doesn't matters. 

的問題是,它使顯示內容周圍少許白邊(近400像素)。我已經在1920x1080,1920x1200和1440x900上進行了測試,並且我桌面上的所有這些分辨率都顯示相同問題的內容。即使在全屏模式下,它仍然保持着白色的小邊框。

爲了確保內容沒有任何問題,我將視圖的背景刷設置爲黑色,並且白色邊框變爲黑色(換句話說,內容縮小得太多以致不適合視圖)。

一旦根據內容大小改變背景部分,就不會選擇從矩形硬編碼中減去值。 (它應該動態適應)。

有什麼建議嗎?

+0

如果你想用fitInView將整個場景放入視圖中,我認爲你看到的是mainWindow(QDeclarativeView)的邊框。看看去除這些以防止顯示白色邊框。可能是將frameRectangle設置爲一個歸零矩形,或者將邊距繼承和設置爲零將有所幫助。 – TheDarkKnight

+0

@ Merlin069它不是窗框。正如我在問題描述中所說的,這是場景背景。姑息解決方案是用黑色QBrush(我在QML文件上使用黑色背景圖像)繪製場景背景。 – emanuelcds

+0

只需提一下,我已經嘗試過樣式表屬性而沒有成功。這不是邊界。真正的問題是fitInView並不完全適合內容。 – emanuelcds

回答

2

剛剛遇到了問題。由於該錯誤不會被解決,所以我會發布我的部分解決方案。我分類了QGraphicsView並添加了一個方法myFitInView(),它自動執行所需的縮放和居中。

我想如果你需要更多的表現,你也可以直接填充矩陣,但我不需要這個,因此單獨調整和居中。

此外,以前的任何視圖轉換都會丟失,但您也可以通過獲取當前矩陣並相應地修改/相乘來解釋該轉換。

void MyGraphicsView::myFitInView(QRectF const &rect) 
{ 
    QRectF viewRect = frameRect(); 

    double scaleX = viewRect.width()/rect.width(); 
    double scaleY = viewRect.height()/rect.height(); 

    QTransform trans; 
    trans.scale(scaleX, scaleY); 
    setTransform(trans, false); 

    centerOn(rect.width()/2, rect.height()/2); 
} 
+1

它是一個優雅的解決方案。雖然我想在2年前的代碼上進行測試,但當我最初遇到這個問題時。該項目已遷移到Qt 5.2,並沒有發生在這個版本上。我接受它作爲一個正確的答案。 – emanuelcds

+1

我在Qt 5.4.1上遇到了確切的問題。 – B3ret

+1

5.2.0沒有發生(我們不再更新)。你應該試試。你確定這不是一個上下文問題嗎?你在使用新的opengl場景圖嗎? – emanuelcds

1

看起來像Qt中的錯誤:https://bugreports.qt-project.org/browse/QTBUG-11945。 我醜陋的解決方法就是

QRectF removeMargin11945(const QRectF& sceneRect, const QSize& viewerSize){ 
    const int bugMargin = 2; 
    const double mx = sceneRect.width()/viewerSize.width()*bugMargin; 
    const double my = sceneRect.height()/viewerSize.height()*bugMargin; 
    return sceneRect.adjusted(mx, my, -mx, -my); 
} 

是什麼使得它特別難看的是,有時它不是必需的,事情就做工精細,要仔細辨別這些情況。

+0

一旦該解決方案應用於多種分辨率和寬高比,則不可接受。邊際不是恆定的。這取決於分辨率。 – emanuelcds