在Ubuntu 10.4上使用Qt 4.6
我的MainWindow中有一个QGraphicsView中央小部件。每次程序切换到一个新的水平(推箱子游戏),我希望MainWindow调整到视图的新大小。我主要通过将主窗口和视图的最大和最小宽度/高度设置为相同的东西来实现这一点,并且这在大多数时间都有效,但是在一些较小的级别上,MainWindow仅在一个维度上收缩,并留下白色边距一边是这样的:
在我点击视图之前,它一直保持这种状态,此时MainWindow缩小到视图。我可以在此之前输入击键来移动我的家伙并执行其他命令并保留边距,只需点击鼠标即可缩小它。
我提出了一个hackish修正案move( geometry().x() + 1, geometry().y() ); // force mainWindow to update
move( geometry().x() - 1, geometry().y() ); // hackish but only thing that works
但这似乎很蹩脚,很可能不便携,虽然我不确定其他平台上是否存在这个问题。有什么想法吗?
答案 0 :(得分:0)
当您使用resize或setGeometry方法时,您的矩形受到小部件minimum大小的约束。
默认情况下,这是0,0但您是否有可能通过布局设置代码中的最小大小,以便resize方法拒绝您给定的参数?
答案 1 :(得分:0)
这是我用于从MainWindow构建和设置视图/场景的所有代码
m_scene->setSceneRect( -width/2, -height/2, width, height );
m_view = new QGraphicsView( m_scene );
m_view->setRenderHint( QPainter::Antialiasing );
m_view->setResizeAnchor( QGraphicsView::AnchorViewCenter );
m_view->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
m_view->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
m_view->setFixedWidth( width );
m_view->setFixedHeight( height );
setMaximumWidth( width );
setMinimumWidth( width );
setMaximumHeight( height );
setMinimumHeight( height );
setCentralWidget( m_view );
m_view->show();
move( geometry().x() + 1, geometry().y() ); // force mainWindow to update
move( geometry().x() - 1, geometry().y() ); // hackish but only thing that works
m_view->setFocus();
编辑:我的程序中唯一的布局(我知道)是隐式构造的MainWindow布局,我没有使用任何QGraphicsLayouts等。
答案 2 :(得分:0)
我发现了以下更好的解决方法:
...
setCentralWidget( m_view );
m_view->show();
activateWindow();
raise();
m_view->setFocus();
我注意到当显示的新级别视图具有与前一个相同的x维度但是y维度较小(反之亦然)时,边距无法缩小,因此显然QMainWindow仅将其大小调整为其子内容子窗口小部件的宽度和高度更改,或者MainWindow接收移动事件(至少在GNOME 2.x上)。在MainWindow上调用activateWindow()和raise()似乎可以解决问题,然后我可以将焦点返回到视图。