2012-03-25 190 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