中心Qt子窗口相对于父级

时间:2011-09-11 23:28:41

标签: python qt

我有一个QMainWindow,它创建多个QDialog子窗口并将自己设置为父窗口。当有一个监视器时,一切正常,窗口在当前监视器中正确居中。但是当我有多个监视器时,子窗口往往在主监视器上打开,而不是在QMainWindow当前所在的监视器上打开。

请注意,我的窗口必须能够在其父窗口之外导航(它们各自都设置了Qt.Window标志)。

那么,我如何将一个小部件相对于它的父位置(即以QMainWindow为中心)居中,以避免它们在其他地方开放呢?

以下是我目前使用的窗口中心:

def centerOnScreen(widget):
    desktopWidget = QApplication.desktop()
    screenRect = desktopWidget.availableGeometry(widget)
    widget.move(screenRect.center() - widget.rect().center())

2 个答案:

答案 0 :(得分:3)

您的代码似乎是实现理想行为的良好尝试。两个建议:

  1. 尝试直接找到QMainWindow的左侧,顶部,宽度和高度,而不是获取桌面参数。
  2. 在调用Exec方法之前,使用此几何信息将对话框移动(并可能调整大小)到应用程序的中心。
  3. 希望有所帮助。

答案 1 :(得分:2)

引用Qt的documentation “桌面可能由多个屏幕组成,因此例如,尝试将某些小部件置于桌面几何体中是不正确的。”

因为你可以看到Qt本身说这是一种不正确的方法来集中一个小部件。

正如@kroonwijk建议的那样,我要么使用QMainWindow的几何()进行居中。

如果您无法在此窗口小部件的范围内获取主窗口的访问权限,则获取顶级窗口小部件的一种方法是使用QApplication::topLevelWidgets。然后,您可以使用一些技巧(例如元信息)来获取主窗口。