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參考的信息,但我無法弄清楚發生了什麼問題。請幫忙。
如果您調用view.fitInView(scene.sceneRect()),它能正常工作嗎? – TheDarkKnight
是的,這將工作。這是因爲fitInView通過操縱視圖矩陣來縮放場景以適應View。但那不是我想要的。任何尺寸的場景都可以製作成適合QGraphicsView的方式。對於我的應用程序,我不能允許這樣的縮放。我想要在屏幕上的像素和QGraphicsScene中的像素之間進行1對1映射。 – balajeerc
是的,我知道它是如何工作的,但會根據您的答案詢問其他問題。無論如何,我看到你已經解決了,所以這很好。 – TheDarkKnight