GridGayout中的QGraphicsView大小

时间:2011-10-23 18:13:39

标签: c++ qt

我找到了这个:Getting the size of a QGraphicsView

但我无法弄清楚“将我的初始化代码移动到showEvent”是什么意思,我不能对这个答案发表评论。

我想调整QPixmap的大小,以便它适合我的QGraphicsView。我已将我的graphicsview放在Designer中,并为我的主窗口设置GridLayout。在MainWindow构造函数中,我编写了以下代码:    UI-> setupUi(本);

// 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,我会得到正确的大小。 那么,我该怎么处理呢?

谢谢。

2 个答案:

答案 0 :(得分:0)

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

一种工作方式是覆盖QWidget :: showEvent(),并将调整代码放在那里。

然而,一个更简单的方法,经常在构造函数中工作,就是要求小部件提供sizeHint(),而不是它的尚未布局的大小。

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

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

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

答案 1 :(得分:0)

在显示窗口小部件后,QGraphicsView将调整QGridLayout的大小,并且在窗口自身调整大小后也可以稍后调整大小。

因此,您应该通过QResizeEvent的子类化来重新定义QGraphicsView,然后将视图对象提升为新的类,从而更改像素图的大小resizeEvent()设计人员使用它代替QGraphicsView,或者将MainWindow对象安装为视图的事件过滤器,以处理来自MainWindow::eventFilter函数的resize事件。

您可能不希望更改场景中的像素图大小,而是调整视图矩阵,以便QGraphicsPixmapItem完全适合视图,QGraphicsView::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);
}