我找到了这个: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,我会得到正确的大小。 那么,我该怎么处理呢?
谢谢。
答案 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);
}