PyQt4如何将窗口居中显示在当前屏幕上

19
我如何将窗口居中显示在活动屏幕上而不是一般屏幕上?此代码将窗口移动到一般屏幕的中心,而不是活动屏幕的中心:
import sys
from PyQt4 import QtGui

class MainWindow(QtGui.QWidget):

    def __init__(self):
        super(MainWindow, self).__init__()

        self.initUI()

    def initUI(self):

        self.resize(640, 480)
        self.setWindowTitle('Backlight management')
        self.center()

        self.show()

    def center(self):
        frameGm = self.frameGeometry()
        centerPoint = QtGui.QDesktopWidget().availableGeometry().center()
        frameGm.moveCenter(centerPoint)
        self.move(frameGm.topLeft())

def main():
    app = QtGui.QApplication(sys.argv)
    mainWindow = MainWindow()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

如果我从 initUI() 中删除 self.center() ,那么窗口将会在活动屏幕的 0x0 处打开。 我需要在活动屏幕上打开窗口并将该窗口移动到该屏幕的中心位置。谢谢!
8个回答

32

将您的center方法修改为以下内容:

def center(self):
    frameGm = self.frameGeometry()
    screen = QtGui.QApplication.desktop().screenNumber(QtGui.QApplication.desktop().cursor().pos())
    centerPoint = QtGui.QApplication.desktop().screenGeometry(screen).center()
    frameGm.moveCenter(centerPoint)
    self.move(frameGm.topLeft())

这个函数基于鼠标指针的位置。它使用screenNumber函数来确定鼠标当前在哪个屏幕上活动。然后找到该监视器的screenGeometry和该屏幕的中心点。使用此方法,即使显示器分辨率不同,您也应该能够将窗口放置在屏幕中心。


请注意,如果没有先调用resize()函数,屏幕可能无法正确居中显示。 - mchen

9

对于PyQt5用户,需要进行一项更正:

import PyQt5

def center(self):
    frameGm = self.frameGeometry()
    screen = PyQt5.QtWidgets.QApplication.desktop().screenNumber(PyQt5.QtWidgets.QApplication.desktop().cursor().pos())
    centerPoint = PyQt5.QtWidgets.QApplication.desktop().screenGeometry(screen).center()
    frameGm.moveCenter(centerPoint)
    self.move(frameGm.topLeft())

3

又是一个(晚点的)答案:

from PyQt5.QtWidgets import QDesktopWidget

def center(self):
    qr = self.frameGeometry()
    cp = QDesktopWidget().availableGeometry().center()
    qr.moveCenter(cp)
    self.move(qr.topLeft())

2
完美地为PtQt5工作 - 非常感谢! - Wilan

1

这是与pyside6兼容的更新:

def center(self):
    frame_geo = self.frameGeometry()
    screen = self.window().windowHandle().screen()
    center_loc = screen.geometry().center()
    frame_geo.moveCenter(center_loc)
    self.move(frame_geo.topLeft())

它将把窗口移动到屏幕中心位置。

1
其他答案在使用PySide2时出现了一些弃用警告。因此,这是我对相同函数的版本:
def center(self):
    screen = QtGui.QGuiApplication.screenAt(QtGui.QCursor().pos())
    fg = self.frameGeometry()
    fg.moveCenter(screen.geometry().center())
    self.move(fg.topLeft())

这在Qt6中非常有效,因为其他答案使用了已弃用的函数。 - Jorge

0
frameGeometry = self.frameGeometry()
windowFrameGeometry = self.window.frameGeometry()
x = int(frameGeometry.center().x()-windowFrameGeometry.center().x())
y = int(frameGeometry.center().y()-windowFrameGeometry.center().y())
self.window.move(x,y)

0

以上方法都对我无效,所以我不得不想出自己的解决方案。

这适用于PyQt5和多个监视器。

对于不同的窗口尺寸,只需调整乘数即可:

from PyQt5 import QtWidgets

main_window = QtWidgets.QMainWindow()
multiplier_x = 2
multiplier_y = 2
cursor_pos = QtWidgets.QApplication.desktop().cursor().pos()
screen = QtWidgets.QApplication.desktop().screenNumber(cursor_pos)
pos_x = QtWidgets.QDesktopWidget().screenGeometry(screen).center().x()
pos_x -= main_window.frameGeometry().center().x() * multiplier_x
pos_y = QtWidgets.QDesktopWidget().screenGeometry(screen).center().y()
pos_y -= main_window.frameGeometry().center().y() * multiplier_y
main_window.move(pos_x, pos_y)

我使用了它,然后我的窗口超出了任何一个显示器的视野范围。 - undefined

0
self.move(QDesktopWidget().availableGeometry().center().x() - self.frameGeometry().center().x() * 0.5, QDesktopWidget().availableGeometry().center().y() - self.frameGeometry().center().y() * 0.5)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接