2012-03-25 73 views
4

我在搞QGraphicsViewQGraphicsScene來創建一個Tic Tac Toe克隆。我將一些QGraphicsLineItem s添加到我的場景中,並覆蓋包含該視圖的Widget的resizeEvent方法,以便在調整窗口大小時適當縮放視圖及其內容。這工作得很好,除了我第一次運行該程序:QGraphicsScene在QGraphics中縮放很奇怪查看

Incorrect scaling

一旦我調整任何數量的窗口,現場正確縮放:

Correct scaling

這裏的代碼:

main.cpp中:

#include <QtGui> 

#include "TestApp.h" 

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

    TestApp window; 
    window.show(); 

    return app.exec(); 
} 

TestApp.h:

#ifndef TEST_APP_H 
#define TEST_APP_H 

#include <QtGui> 

class TestApp : public QMainWindow 
{ 
    Q_OBJECT 
public: 
    TestApp(); 
protected: 
    void resizeEvent(QResizeEvent* event); 

    QGraphicsView* view; 
    QGraphicsScene* scene; 
}; 

#endif 

TestApp.cpp:

#include "TestApp.h" 

TestApp::TestApp() 
: view(new QGraphicsView(this)) 
, scene(new QGraphicsScene(this)) 
{ 
    resize(220, 220); 
    scene->setSceneRect(0, 0, 200, 200); 

    const int BOARD_WIDTH = 3; 
    const int BOARD_HEIGHT = 3; 
    const QPoint SQUARE_SIZE = QPoint(66, 66); 

    const int LINE_WIDTH = 10; 
    const int HALF_LINE_WIDTH = LINE_WIDTH/2; 
    QBrush lineBrush = QBrush(Qt::black); 
    QPen linePen = QPen(lineBrush, LINE_WIDTH); 

    for(int x = 1; x < BOARD_WIDTH; ++x) 
    { 
     int x1 = x * SQUARE_SIZE.x(); 
     scene->addLine(x1, HALF_LINE_WIDTH, x1, scene->height() - HALF_LINE_WIDTH, linePen); 
    } 
    for(int y = 1; y < BOARD_HEIGHT; ++y) 
    { 
     int y1 = y * SQUARE_SIZE.y(); 
     scene->addLine(HALF_LINE_WIDTH, y1, scene->width() - HALF_LINE_WIDTH, y1, linePen); 
    } 

    view->setScene(scene); 
    view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    view->show(); 
    view->installEventFilter(this); 

    setCentralWidget(view); 
} 

void TestApp::resizeEvent(QResizeEvent* event) 
{ 
    view->fitInView(0, 0, scene->width(), scene->height()); 
    QWidget::resizeEvent(event); 
} 

我試圖在TestApp的構造函數的末尾添加到fitInView通話,但它似乎沒有做任何事情 - 無論如何,resizeEvent似乎在程序執行開始時被調用一次。

乾杯。

回答

6

處理的觀點也契合了showEvent內:

void TestApp::showEvent (QShowEvent * event) 
{ 
    view->fitInView(0, 0, scene->width(), scene->height()); 
    QWidget::showEvent(event); 
} 
+0

嗨Masci。我嘗試用這個替換構造函數中的調用,但沒有任何更改。在每次調用'fitInView'之前,場景的寬度和高度都是200。我嘗試用上面的代碼替換'resizeEvent'中'fitInView'的調用,唯一的區別是網格具有正確的比例:[http://i.imgur.com/JI2pg.png](http ://i.imgur.com/JI2pg.png) – Mitch 2012-03-25 10:21:06

+0

對不起,我沒有注意到你明確設置了場景矩形。我更新了我的答案。 – Masci 2012-03-25 11:05:19

+0

謝謝,效果很好。 :) – Mitch 2012-03-25 11:46:35