获取 QGraphicsView 的更新大小

Posted

技术标签:

【中文标题】获取 QGraphicsView 的更新大小【英文标题】:Get updated size of QGraphicsView 【发布时间】:2010-05-17 19:29:14 【问题描述】:

在我的 Qt 应用程序中,我动态创建 QGraphicsView(s) 并将它们添加到里面 QGridLayout。 当我在网格内添加第一个视图时,该视图覆盖了网格内的所有可用空间。 然后我添加第二个视图,现在网格内有两个大小相同的视图。 然后我添加第三个视图,现在网格内有三个大小相同的视图。 以此类推。

如何获取第一个视图的更新大小?

以下是我的试用版,但我认为这不起作用。

//Definition of viewsPerRow
 static const int viewsPerRow = 3;
 void window::newViewRequested()
 
     QGraphicsView *view = new QGraphicsView;
     view->setVisible(true);
     viewVector.push_back(view);

     for(int i = viewGrid->count(); i < viewVector.count(); i++)
     
       viewGrid->addWidget(view,i / viewsPerRow ,i % viewsPerRow);
     
      qDebug()<<viewGrid->cellRect(0,0);
    

【问题讨论】:

我们过去遇到的一个问题是他们的布局可能会延迟调整任何小部件的大小,直到他们需要;通常在他们画画之前。因此,在布局完成之前,从布局中的小部件获取大小可能不正确。我相信有一个功能会导致布局调整大小发生,但不记得它是什么。 你想用尺寸做什么? cjhuit 是对的,通常布局在需要之前不会更正尺寸。如果您需要在布局自行修复后同步获取大小,您可能正在做一些您不应该做的事情。但是,如果您真的想这样做,请在添加小部件后调用 viewGrid->activate() 以强制它重做布局。 没有认真的目的,只是想学习Qt Framework。但是 viewGrid->activate() 不起作用。 如果您仍然真的想这样做,请尝试在***小部件上强制绘制。同样,它可能不起作用。 Qt 做的更新尽可能少。 【参考方案1】:

您可能应该使用QWidget::rect() 方法来获取视图本身的几何形状。这是一个应该按预期工作的示例。

QVector< QGraphicsView* > views;
for (int i=0 ; i < 3; ++i) 
  QGraphicsView *view = new QGraphicsView;
  view->setVisible(true);
  viewGrid->addWidget(view, i ,0);
  views.push_back(view);


qDebug() << "The view size of the first view is " << views[0]->rect();

【讨论】:

我试过你的代码。当我添加第一个视图时,我得到了 QGraphicsView 的默认大小,即 256 x 192。当我添加第二个视图时,我得到了计算大小,但这次计算是错误的(我认为它认为只存在一个视图)。当我添加第三个时,我再次计算出错误的大小(这次我认为它认为存在两个视图)【参考方案2】:

不知道为什么你需要第一个视图的大小,但是 Qt 在它“认为”它适合的时候只做很少的重绘。因此,您不能依赖在视图之外查询的大小。

我会尝试使用resizeEvent 在项目大小发生变化时收到通知,然后执行必要的操作。

【讨论】:

以上是关于获取 QGraphicsView 的更新大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QGraphicsView 上添加效果?

如何在不缩放场景的情况下与 QGraphicsView 左侧的矩形对齐?

如何在 QGraphicsView::Scale 之后调整 QGraphicsView 的大小

QGraphicsView 的大小与预期不同

QGraphicsView 适合任何大小的图像,没有滚动条

停止 Qt QGraphicsView 在重新调整大小时滚动