18

This code works, but I wonder if there is any simpler way:

def center(self):
    qr = self.frameGeometry()
    cp = gui.QDesktopWidget().availableGeometry().center()
    qr.moveCenter(cp)
    self.move(qr.topLeft())
Freewind
  • 193,756
  • 157
  • 432
  • 708

6 Answers6

20

just add this line to your main windows :

self.move(QtGui.QApplication.desktop().screen().rect().center()- self.rect().center())
Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343
alrawab
  • 217
  • 3
  • 8
9
self.move(QDesktopWidget().availableGeometry().center() - self.frameGeometry().center())
inv
  • 4,759
  • 1
  • 17
  • 10
5

No, it's the simplest way. Here is a snippet I've used in C++:

  QRect desktopRect = QApplication::desktop()->availableGeometry(this);
  QPoint center = desktopRect.center();

  move(center.x() - width() * 0.5, center.y() - height());
Dmitriy
  • 5,357
  • 8
  • 45
  • 57
  • 3
    I think it's better to use `frameGeometry()` like in OP's code instead `width()` and `height()`([Qt. Window Geometry](http://developer.qt.nokia.com/doc/qt-4.8/application-windows.html#window-geometry)) – reclosedev Feb 20 '12 at 18:07
2

Just another "func-style" example. If you use it several times.

screen_center = lambda widget: QApplication.desktop().screen().rect().center()- widget.rect().center()

And every time in code:

widget.move(screen_center(widget))
eyllanesc
  • 235,170
  • 19
  • 170
  • 241
KMiNT21
  • 21
  • 2
2

QDesktopWidget is deprecated. Use QScreen instead.

    def centerWidgetOnScreen(self, widget):
        centerPoint = QtGui.QScreen.availableGeometry(QtWidgets.QApplication.primaryScreen()).center()
        fg = widget.frameGeometry()
        fg.moveCenter(centerPoint)
        widget.move(fg.topLeft())
1

It works for me:

from PySide2.QtGui import QGuiApplication

# ...

    def center(self):
        centerPoint = QGuiApplication.screens()[0].geometry().center()
        self.move(centerPoint - self.frameGeometry().center())

8Observer8
  • 868
  • 10
  • 17