C++ 将QMainWindow设置在屏幕中央

C++ 将QMainWindow设置在屏幕中央,c++,qt,C++,Qt,我的QMainWindow包含一个QGraphicsView,它应该具有最小宽度和高度。因此,我在QMainWindow构造函数中使用了以下代码: ui.graphicsView->setMinimumHeight(VIEWWIDTH); ui.graphicsView->setMinimumWidth(VIEWWIDTH); 然后,我使用以下代码在屏幕中央设置QMainWindow: QRect available_geom = QDesktopWidget().availabl

我的
QMainWindow
包含一个
QGraphicsView
,它应该具有最小宽度和高度。因此,我在
QMainWindow
构造函数中使用了以下代码:

ui.graphicsView->setMinimumHeight(VIEWWIDTH);
ui.graphicsView->setMinimumWidth(VIEWWIDTH);
然后,我使用以下代码在屏幕中央设置
QMainWindow

QRect available_geom = QDesktopWidget().availableGeometry();
QRect current_geom = frameGeometry();
setGeometry(available_geom.width() / 2 - current_geom.width() / 2,
            available_geom.height() / 2 - current_geom.height() / 2,
            current_geom.width(),
            current_geom.height());
但它并没有设置在屏幕的中心。如果从
QGraphicsView
中省略
setMinimumHeight()
setMinimumWidth()
,则主窗口设置在屏幕的中心。如何克服这个问题?我正在使用Qt4.5.2


谢谢。

您遇到的问题是Qt将尽可能长时间延迟许多计算。当您设置图形视图的最小宽度和高度时,它会在某个位置设置一个标志,表明图形视图所在的窗口需要重新布局。然而,它不会这样做,直到它不得不。。。在屏幕上实际显示之前的几毫秒。因此,当您在主窗口上调用
rect()
时,您得到的是旧矩形,而不是新矩形

我的最佳建议是在主窗口中扩展“大小更改”事件,并在该事件中调整位置。您可能还必须在实际显示窗口时进行标记,以便在显示后用户调整窗口大小时,您不会重新定位窗口


或者,您可以尝试通过扩展show event函数并在那里执行操作来重新定位窗口。这可能发生在用户实际看到窗口之前,但有时可能会闪烁。

通常不鼓励手动定位窗口。窗口管理器的工作是定位窗口,如果您的应用程序手动将其自身居中,则会导致不一致。例如,在我的双头系统上,您的代码将把窗口放在哪里?除非你有很好的理由,否则不要微观管理窗口的位置。我见过从屏幕中间开始的软件。看起来不错。