QGraphicsScene在QGraphicsView中奇怪地缩放

时间:2012-03-25 08:59:45

标签: c++ qt scaling qgraphicsview qgraphicsscene

我正在使用QGraphicsViewQGraphicsScene来创建一个Tic Tac Toe克隆。我在场景中添加了一些QGraphicsLineItem并覆盖了包含视图的Widget的resizeEvent方法,以便在调整窗口大小时,适当缩放视图及其内容。这工作正常,除了我第一次运行程序:

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);
}

我尝试在fitInView的构造函数末尾添加对TestApp的调用,但它似乎没有做任何事情 - resizeEvent似乎被调用一次无论如何,程序执行的开始。

干杯。

1 个答案:

答案 0 :(得分:8)

在showEvent中处理视图拟合:

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