2013-07-08 137 views
2

我期待以下代碼片段向我展示我的監視器(其分辨率爲1920x1080)每個角上4個方格的無框和全屏QGraphicsView,佔用整個監視器的幀緩衝區:瞭解從視圖座標到場景座標的映射

int main(int argc, char **args) 
{ 
    QApplication app(argc, args); 

    const int monitorWidth = 1920; 
    const int monitorHeight = 1080; 
    const int rectDim = 40; 

    QGraphicsView view; 
    view.setWindowFlags(Qt::FramelessWindowHint); 
    view.setGeometry(0, 0, monitorWidth, monitorHeight); 
    view.showFullScreen(); 

    QGraphicsScene scene; 
    scene.setBackgroundBrush(Qt::black); 
    scene.setSceneRect(QRectF(0.f, 0.f, monitorWidth, monitorHeight)); 
    view.setScene(&scene); 

    //Create 4 rectangle items 
    QGraphicsRectItem items[4]; 

    //top left corner 
    items[0].setRect(QRect(0, 0, rectDim, rectDim)); 
    items[0].setPen(QPen(Qt::red)); 
    items[0].setBrush(Qt::red); 

    //top right corner 
    items[1].setRect(QRect(monitorWidth-rectDim, 0, rectDim, rectDim)); 
    items[1].setPen(QPen(Qt::red)); 
    items[1].setBrush(Qt::red); 

    //bottom left corner 
    items[2].setRect(QRect(0, monitorHeight-rectDim, rectDim, rectDim)); 
    items[2].setPen(QPen(Qt::red)); 
    items[2].setBrush(Qt::red); 

    //bottom right corner 
    items[3].setRect(QRect(monitorWidth-rectDim, monitorHeight-rectDim, rectDim, rectDim)); 
    items[3].setPen(QPen(Qt::red)); 
    items[3].setBrush(Qt::red); 

    for(unsigned int i=0; i<4; ++i) 
    { 
     scene.addItem(items+i); 
    } 

    return app.exec(); 
} 

我發現,我得到了我的QGraphicsView其中出現當QGraphicsScene矩形超出的QGraphicsView的視口的邊界的滾動條。但是,如上面的代碼所示,兩者完全匹配。即使我使用隱藏滾動條:

view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 

我發現,底部和右側方形剪裁完全意味着仍有QGraphicsScene的某些部分是不是在可見的QGraphicsView。爲什麼會這樣?

很明顯,我的困惑在於場景座標到視圖的映射。儘管閱讀了關於coordinate systems in the QGraphicsView參考的信息,但我無法弄清楚發生了什麼問題。請幫忙。

+0

如果您調用view.fitInView(scene.sceneRect()),它能正常工作嗎? – TheDarkKnight

+0

是的,這將工作。這是因爲fitInView通過操縱視圖矩陣來縮放場景以適應View。但那不是我想要的。任何尺寸的場景都可以製作成適合QGraphicsView的方式。對於我的應用程序,我不能允許這樣的縮放。我想要在屏幕上的像素和QGraphicsScene中的像素之間進行1對1映射。 – balajeerc

+0

是的,我知道它是如何工作的,但會根據您的答案詢問其他問題。無論如何,我看到你已經解決了,所以這很好。 – TheDarkKnight

回答

1

從Qt論壇回覆cross post I made得到答案。

座標不匹配來自QGraphicsView引入的框架的額外像素。它通過設置來解決:

view.setFrameShape(QGraphicsView::NoFrame);