From 40dca34fdef32b2790e201b4c94ef991b3d55ab9 Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Mon, 22 Sep 2025 09:05:51 -0400 Subject: [PATCH] Flip screen-info script to qt6, refine it to heck. Buncha updates and improvements, - adjust sub-namespace imports according to console warnings. - iterate all detected screens in a loop and instead report which is the primary and the current. - type annotate all vars where non-obvious, particularly the`Qt` refs. --- snippets/qt_screen_info.py | 131 +++++++++++++++++++++---------------- 1 file changed, 73 insertions(+), 58 deletions(-) diff --git a/snippets/qt_screen_info.py b/snippets/qt_screen_info.py index 238367c0..9862a9b8 100644 --- a/snippets/qt_screen_info.py +++ b/snippets/qt_screen_info.py @@ -1,4 +1,22 @@ -""" +# piker: trading gear for hackers +# Copyright (C) Tyler Goodlet (in stewardship for pikers) + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +''' +A per-display, DPI (scaling) info dumper. + Resource list for mucking with DPIs on multiple screens: - https://stackoverflow.com/questions/42141354/convert-pixel-size-to-point-size-for-fonts-on-multiple-platforms @@ -12,89 +30,86 @@ Resource list for mucking with DPIs on multiple screens: - https://stackoverflow.com/questions/16561879/what-is-the-difference-between-logicaldpix-and-physicaldpix-in-qt - https://doc.qt.io/qt-5/qguiapplication.html#screenAt -""" +''' from pyqtgraph import QtGui -from PyQt5.QtCore import ( - Qt, QCoreApplication +from PyQt6 import ( + QtCore, + QtWidgets, +) +from PyQt6.QtCore import ( + Qt, + QCoreApplication, + QSize, + QRect, ) # Proper high DPI scaling is available in Qt >= 5.6.0. This attibute # must be set before creating the application if hasattr(Qt, 'AA_EnableHighDpiScaling'): - QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) + QCoreApplication.setAttribute( + Qt.AA_EnableHighDpiScaling, + True, + ) if hasattr(Qt, 'AA_UseHighDpiPixmaps'): - QCoreApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True) + QCoreApplication.setAttribute( + Qt.AA_UseHighDpiPixmaps, + True, + ) - -app = QtGui.QApplication([]) -window = QtGui.QMainWindow() -main_widget = QtGui.QWidget() +app = QtWidgets.QApplication([]) +window = QtWidgets.QMainWindow() +main_widget = QtWidgets.QWidget() window.setCentralWidget(main_widget) window.show() -pxr = main_widget.devicePixelRatioF() +pxr: float = main_widget.devicePixelRatioF() -# screen_num = app.desktop().screenNumber() -# screen = app.screens()[screen_num] - -screen = app.screenAt(main_widget.geometry().center()) - -name = screen.name() -size = screen.size() -geo = screen.availableGeometry() -phydpi = screen.physicalDotsPerInch() -logdpi = screen.logicalDotsPerInch() - -print( - # f'screen number: {screen_num}\n', - f'screen name: {name}\n' - f'screen size: {size}\n' - f'screen geometry: {geo}\n\n' - f'devicePixelRationF(): {pxr}\n' - f'physical dpi: {phydpi}\n' - f'logical dpi: {logdpi}\n' +# explicitly get main widget and primary displays +current_screen: QtGui.QScreen = app.screenAt( + main_widget.geometry().center() ) +primary_screen: QtGui.QScreen = app.primaryScreen() -print('-'*50) +screen: QtGui.QScreen +for screen in app.screens(): + name: str = screen.name() + model: str = screen.model().rstrip() + size: QSize = screen.size() + geo: QRect = screen.availableGeometry() + phydpi: float = screen.physicalDotsPerInch() + logdpi: float = screen.logicalDotsPerInch() + is_primary: bool = screen is primary_screen + is_current: bool = screen is current_screen -screen = app.primaryScreen() + print( + f'------ screen name: {name} ------\n' + f'|_primary: {is_primary}\n' + f' _current: {is_current}\n' + f' _model: {model}\n' + f' _screen size: {size}\n' + f' _screen geometry: {geo}\n' + f' _devicePixelRationF(): {pxr}\n' + f' _physical dpi: {phydpi}\n' + f' _logical dpi: {logdpi}\n' + ) -name = screen.name() -size = screen.size() -geo = screen.availableGeometry() -phydpi = screen.physicalDotsPerInch() -logdpi = screen.logicalDotsPerInch() - -print( - # f'screen number: {screen_num}\n', - f'screen name: {name}\n' - f'screen size: {size}\n' - f'screen geometry: {geo}\n\n' - f'devicePixelRationF(): {pxr}\n' - f'physical dpi: {phydpi}\n' - f'logical dpi: {logdpi}\n' -) - - -# app-wide font +# app-wide font info font = QtGui.QFont("Hack") # use pixel size to be cross-resolution compatible? font.setPixelSize(6) - fm = QtGui.QFontMetrics(font) -fontdpi = fm.fontDpi() -font_h = fm.height() - -string = '10000' -str_br = fm.boundingRect(string) -str_w = str_br.width() +fontdpi: float = fm.fontDpi() +font_h: int = fm.height() +string: str = '10000' +str_br: QtCore.QRect = fm.boundingRect(string) +str_w: int = str_br.width() print( - # f'screen number: {screen_num}\n', + f'------ global font settings ------\n' f'font dpi: {fontdpi}\n' f'font height: {font_h}\n' f'string bounding rect: {str_br}\n'