【问题标题】:QGraphicsView size in a GridLayoutGridLayout 中的 QGraphicsView 大小
【发布时间】:2011-10-23 18:13:39
【问题描述】:

我发现了这个:Getting the size of a QGraphicsView

但我不知道“将我的初始化代码移动到 showEvent”是什么意思,我无法评论这个答案。

我想调整 QPixmap 的大小,使其适合我的 QGraphicsView。我已将我的图形视图放在 Designer 中,并为我的主窗口设置了 GridLayout。在 MainWindow 构造函数中,我编写了以下代码: ui->setupUi(this);

// Get GView size
g_sizeX = ui->mapView->width();
g_sizeY = ui->mapView->height();
// Init  scene
scene = new QGraphicsScene(this);
// Init MAP pixmap and add it to scene
mapImage = new QPixmap(":/Map/europe.jpg");
QPixmap newmapImage = mapImage->scaled(g_sizeX, g_sizeY);
scene->addPixmap(newmapImage);

// Display scene in gview.
ui->mapView->setScene(scene);

但我总是得到 100x30 的尺寸。如果我打破 gridLayout,我会得到正确的大小。 那么,我该如何处理呢?

谢谢。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    QGraphicsView 将在小部件显示后由QGridLayout 调整大小,并且可以在稍后调整窗口本身大小时调整大小。

    所以你应该改变像素图的大小作为QResizeEvent的结果,或者通过子类化QGraphicsView来重新定义resizeEvent(),然后在设计器中将你的视图对象提升到你的新类来使用它QGraphicsView,或者通过将 MainWindow 对象安装为视图的事件过滤器来处理来自 MainWindow::eventFilter 函数的调整大小事件。

    您可能不想更改场景中的像素图大小,而是调整视图矩阵,使您的QGraphicsPixmapItemQGraphicsView::fitInView 完美契合在视图中。

    例如:

    /* QGraphicsPixmapItem *pixmapItem; as a MainWindow member */
    pixmapItem = scene->addPixmap(newmapImage);
    
    /* Either always disable or enable the scrollbars (see fitInView doc) */
    ui->mapView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->mapView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    
    ui->mapView->installEventFilter(this);
    ...
    bool MainWindow::eventFilter(QObject *obj, QEvent *evt) {
         if(obj == ui->mapView && evt->type() == QEvent::Resize) { 
              ui->mapView->fitInView(pixmapItem, Qt::KeepAspectRatioByExpanding);
         }
         // Call the base class implementation 
         return QMainWindow::eventFilter(obj, evt);
    }
    

    【讨论】:

      【解决方案2】:

      我相信正在发生的事情是 Qt 仅在小部件首次显示时应用布局并设置小部件大小。

      一种工作方式是重写 QWidget::showEvent(),并将您的尺寸调整代码放在那里。

      但是,通常在构造函数中起作用的一种更简单的方法是向小部件询问其 sizeHint(),而不是询问其尚未布局的大小。

      在您的情况下,这意味着将两行代码更改为:

      g_sizeX = ui->mapView->sizeHint().width();
      g_sizeY = ui->mapView->sizeHint().height();
      

      如果您的布局不太复杂,并且您没有覆盖默认大小策略,那么这可能会为您解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-26
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        • 2014-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多