Anoop
Anoop

Reputation: 1305

How to display a window on a secondary display in PyQT?

I am developing an application; which will run on a system with 2 displays. I want my PyQt app to be able to automatically route a particular window to the second screen.

How can this be done in Qt? (either in Python or C++)

Upvotes: 6

Views: 15038

Answers (3)

Ajay
Ajay

Reputation: 406

Too late to add but it might be useful for PySide6 users coming to this question. Should work on PyQt.

Old answers hinted solution for Python. QDesktopWidget was already deprecated in Qt5 and was removed in Qt6. QScreen provides equivalent functionality for information about available screens, screen geometries. QRect property of screen geometry can be used to move widget. (https://doc.qt.io/qtforpython-6/overviews/widgets-changes-qt6.html#qdesktopwidget-and-qapplication-desktop).

app = QApplication(sys.argv)
widget = MyWidget()

screens = app.screens()
# one way; with two screens    
if len(screens) > 1:
    screen = screens[1]
else:
    screen = screens[0]

# Another way to remove primary screen and choose from remaining screens
# current_screen = app.primaryScreen()
# screens.remove(current_screen)
# screen = screens[0]

qr = screen.geometry()
widget.move(qr.left(), qr.top())
widget.show()

Upvotes: 1

Agamemnon
Agamemnon

Reputation: 41

The following works for me in PyQt5

import sys
from PyQt5.QtWidgets import QApplication, QDesktopWidget

app = QApplication(sys.argv)

widget = ... # define your widget
display_monitor = ... # the number of the monitor you want to display your widget

monitor = QDesktopWidget().screenGeometry(display_monitor)
widget.move(monitor.left(), monitor.top())
widget.showFullScreen()

Update. In PyQt6 one should use:

...
from PyQt6.QtGui import QScreen
...
monitors = QScreen.virtualSiblings(widget.screen())
monitor = monitors[display_monitor].availableGeometry()
...

Monitors should be counted starting from 0.

Upvotes: 4

O.C.
O.C.

Reputation: 6819

Use QDesktopWidget to access to screen information on multi-head systems.

Here is pseudo code to make a widget cover first screen.

QDesktopWidget *pDesktop = QApplication::desktop ();

//Get 1st screen's geometry
QRect RectScreen0 = pDesktop->screenGeometry (0);

//Move the widget to first screen without changing its geometry
my_Widget->move (RectScreen0.left(),RectScreen0.top());

my_pWidget->resize (RectScreen0.width(),RectScreen0.height());

my_Widget->showMaximized();

Upvotes: 3

Related Questions