首页 文章

Qt fitInView和调整大小

提问于
浏览
2

我试图制作一个 QGraphicsView ,其宽度与位于窗口中心的高度相同 .

我在Qt Designer中创建了一个普通的 QGraphicsView 并设置了最小尺寸,添加了一些计算,将 QGraphicsView 居中放入主窗口的中心,并设置与高度相同的宽度 . 它仅使用 setGeometry . 比我创建一个只有一个非常长的矩形的 QGraphicsScene . 我希望图形场景适合查看,所以我使用了 QGraphicsView::fitInView . 一切正常,但问题来自调整窗口大小 .

当我增加窗口的高度和宽度时,一切都很好 . QGraphicsView 有一个新的位置和一个新的大小 . 当我只减少窗口大小的一部分时,一切仍然正常 . 但是(最后)当我将窗口的大小减小到可能的最小值时,一切都会中断 . 视图中的矩形具有正确的宽度(与没有调整大小相同,我用尺子测量它:)),但是创建了新的边距并且 QGraphicsView 没有定位并且尺寸合适(因此它不仅是边距,但也许 setGeometry 没有效果) .

我注意到,在使用 setGeometry 之前调用 QGraphicsView::fitInView 时会发生同样的事情 .

它让我发疯,请帮忙!

这是一些代码:

void MainWindow::resizeEvent(QResizeEvent *e)
{
    int h = e->size().height(),
        w = e->size().width(),
        s;

    if(w > h) s = h-120;
    else s = w-120;

    ui->board->setGeometry((w-s)/2,(h-s)/2,s,s);

    int scaleWidth = ui->board->scene()->width(),
        scaleHeight = ui->board->scene()->height();

    ui->board->fitInView(QRectF(0, 0, scaleWidth, scaleHeight), Qt::KeepAspectRatio);

}

以下是 QGraphicsView 发生的图像,矩形为红色,视图为蓝色:

this is OK

this is broken

1 回答

  • 8

    我试图使用 QGraphicsView::fitInViewQt::KeepAspectRatio, 并遇到类似的问题 .
    我发现这个答案有用:

    How to anchor QGraphicsView to a special point on a scene?

    看来关键是手动设置场景的边界矩形 . 以下代码对我有用:

    MainWindow::MainWindow(QWidget *parent) : 
        QMainWindow(parent), ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        // Set up graphics view
        scene = new QGraphicsScene(this);
        drawMyWidget();
        scene->setSceneRect(-1.25, -1.25, 2.5, 2.5);    // your scene's bounding rect here...
        ui->graphicsView->setScene(scene);
        ui->graphicsView->show();
    }
    
    void MainWindow::resizeEvent(QResizeEvent *) {
        QRectF bounds = scene->itemsBoundingRect();
        bounds.setWidth(bounds.width()*0.9);         // to tighten-up margins
        bounds.setHeight(bounds.height()*0.9);       // same as above
        ui->graphicsView->fitInView(bounds, Qt::KeepAspectRatio);
        ui->graphicsView->centerOn(0, 0);
    }
    

相关问题