2012-03-25 6 views
4

저는 Tic Tac Toe 복제본을 만들기 위해 QGraphicsViewQGraphicsScene으로 장난하고 있습니다. 내 장면에 QGraphicsLineItem을 추가하고보기가 포함 된 위젯의 resizeEvent 메서드를 재정 의하여 창 크기를 조정하면보기 및 해당 내용의 크기가 적절하게 조정됩니다. 이것은 내가 프로그램 실행이 처음을 제외하고 잘 작동 : 내가 어떤 양만큼 창 크기를 조정하면QGraphicsScene은 QGraphicsView에서 이상하게 확장되었습니다.

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

+0

죄송합니다. 장면 rect를 명시 적으로 설정하지 않았습니다. 나는 나의 대답을 업데이트했다. – Masci

+0

감사합니다. 훌륭한 작품입니다. :) – Mitch

관련 문제