PyQt4活动屏幕上的中心窗口

时间:2013-11-27 13:20:24

标签: python user-interface python-3.x pyqt pyqt4

如何在活动屏幕上居中显示窗口,而不是在普通屏幕上?此代码将窗口移动到一般屏幕的中心,而不是活动屏幕:

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上打开窗口。我需要在活动屏幕上打开窗口并将此窗口移动到此屏幕的中心。 Thansk!

7 个答案:

答案 0 :(得分:24)

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和该屏幕的中心点。使用此方法,即使显示器分辨率不同,您也应该能够将窗口置于屏幕中央。

答案 1 :(得分:1)

针对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())

答案 2 :(得分:0)

使用PySide2时,其他答案与一些不建议使用的警告一起使用。这是同一功能的我的版本:

def center(self):
    screen = QtGui.QGuiApplication.screenAt(QtGui.QCursor().pos())
    fg = self.frameGeometry()
    fg.moveCenter(screen.geometry().center())
    self.move(fg.topLeft())

答案 3 :(得分:0)

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

答案 4 :(得分: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)

答案 5 :(得分:0)

另一个(迟到的)答案:

from PyQt5.QtWidgets import QDesktopWidget

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

答案 6 :(得分:0)

这是适用于 pyside6 的更新:

<aside class="rooted-increment common-card">
    <div class="cover"></div>
    <p>
        My name
    </p>
</aside>

它将把窗口移动到它所在的屏幕中心。