PyQt开启高DPI缩放后如何实现窗口尺寸随不同屏幕自适应调整
PyQt窗口多屏幕尺寸自适应实现方案
核心实现逻辑
通过动态获取当前屏幕的可用分辨率,按1/4屏幕占比计算窗口尺寸,同时设置尺寸阈值,大屏下保持原有固定尺寸不变,小屏下自动缩小到1/4屏幕占比,完全兼容已开启的高DPI缩放特性,不会破坏原有布局。
效果参考
- 台式机显示效果:

- 笔记本显示效果:

代码修改方案
1. 高DPI适配代码优化
可以补充高DPI适配属性,提升显示效果:
import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QHBoxLayout, QTabWidget from PyQt5.QtCore import Qt if __name__ == '__main__': # 原有高DPI缩放开启 QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) # 可选:高DPI下图标自动适配清晰度 QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps) # 可选:兼容不同缩放系数,避免缩放模糊 QApplication.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough) app = QApplication(sys.argv) main_window = QMainWindow() ui = Ui_MainWindow() ui.setupUi(main_window) main_window.show() sys.exit(app.exec_())
2. 窗口尺寸动态计算修改
将setupUi中固定写死的resize逻辑替换为动态计算逻辑:
class Ui_MainWindow(object): def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName(u"MainWindow") # --------------- 新增动态尺寸计算逻辑开始 --------------- # 获取当前窗口所在屏幕的可用分辨率(自动排除任务栏、dock等系统占用区域) screen_available = MainWindow.screen().availableGeometry() screen_width = screen_available.width() screen_height = screen_available.height() # 计算1/4屏幕占比尺寸:宽高各为屏幕可用尺寸的1/2,面积刚好为1/4 target_width = int(screen_width * 0.5) target_height = int(screen_height * 0.5) # 阈值判断:大屏下保持原有800*600的固定尺寸不变,小屏下使用计算后的1/4尺寸 base_width, base_height = 800, 600 final_width = target_width if target_width < base_width else base_width final_height = target_height if target_height < base_height else base_height # 应用最终窗口尺寸 MainWindow.resize(final_width, final_height) # --------------- 动态尺寸计算逻辑结束 --------------- # 原有布局代码完全保持不变 self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName(u"centralwidget") self.horizontalLayout = QHBoxLayout(self.centralwidget) self.horizontalLayout.setObjectName(u"horizontalLayout") self.tabWidget = QTabWidget(self.centralwidget) self.tabWidget.setObjectName(u"tabWidget") # 后续添加控件、tab的逻辑保持不变 # ... MainWindow.setCentralWidget(self.centralwidget)
注意事项
- 后续给标签页内添加控件时,建议全部使用布局管理器(QHBoxLayout/QVBoxLayout/QGridLayout等)嵌套排列,窗口缩放时控件会自动适配大小,不会出现错位问题。
- 如果需要支持窗口拖拽到不同屏幕后自动调整尺寸,可监听
MainWindow.screenChanged信号,触发时重新执行上述尺寸计算逻辑即可。
内容的提问来源于stack exchange,提问作者Ido
相关产品推荐
相关产品推荐

