# 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 - https://stackoverflow.com/questions/25761556/qt5-font-rendering-different-on-various-platforms/25929628#25929628 - https://doc.qt.io/qt-5/highdpi.html - https://stackoverflow.com/questions/20464814/changing-dpi-scaling-size-of-display-make-qt-applications-font-size-get-rendere - https://stackoverflow.com/a/20465247 - https://doc.qt.io/archives/qt-4.8/qfontmetrics.html#width - https://forum.qt.io/topic/54136/how-do-i-get-the-qscreen-my-widget-is-on-qapplication-desktop-screen-returns-a-qwidget-and-qobject_cast-qscreen-returns-null/3 - https://forum.qt.io/topic/43625/point-sizes-are-they-reliable/4 - 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 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, ) if hasattr(Qt, 'AA_UseHighDpiPixmaps'): QCoreApplication.setAttribute( Qt.AA_UseHighDpiPixmaps, True, ) app = QtWidgets.QApplication([]) window = QtWidgets.QMainWindow() main_widget = QtWidgets.QWidget() window.setCentralWidget(main_widget) window.show() pxr: float = main_widget.devicePixelRatioF() # explicitly get main widget and primary displays current_screen: QtGui.QScreen = app.screenAt( main_widget.geometry().center() ) primary_screen: QtGui.QScreen = app.primaryScreen() 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 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' ) # app-wide font info font = QtGui.QFont("Hack") # use pixel size to be cross-resolution compatible? font.setPixelSize(6) fm = QtGui.QFontMetrics(font) 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'------ global font settings ------\n' f'font dpi: {fontdpi}\n' f'font height: {font_h}\n' f'string bounding rect: {str_br}\n' f'string width : {str_w}\n' )