Reputation: 1305
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
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
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
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