1

在 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

但这似乎很蹩脚,很可能不便携,尽管我不确定这个问题是否存在于其他平台上。有任何想法吗?

4

3 回答 3

0

当您使用resizesetGeometry方法时,您的矩形受小部件的最小尺寸约束。

默认情况下这是 0,0,但是您是否有可能通过布局在代码中设置最小大小,以便调整大小方法拒绝您给定的参数?

于 2011-06-22T06:38:08.927 回答
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 等。

于 2011-06-22T07:24:14.250 回答
0

我通过以下方法找到了更好的解决方法:

...
setCentralWidget( m_view );
m_view->show();
activateWindow();
raise();
m_view->setFocus();

我注意到当显示的新级别视图具有与前一个相同的 x 尺寸但较小的 y 尺寸(反之亦然)时,边距无法缩小,因此显然 QMainWindow 仅在宽度和子窗口小部件的高度发生变化,或者 MainWindow 接收到移动事件(至少在 GNOME 2.x 上)。在 MainWindow 上调用 activateWindow() 和 raise() 似乎可以解决问题,然后我可以将焦点返回到视图。

于 2011-06-22T20:31:40.677 回答