You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt开启高DPI缩放后如何实现窗口尺寸随不同屏幕自适应调整

PyQt窗口多屏幕尺寸自适应实现方案

核心实现逻辑

通过动态获取当前屏幕的可用分辨率,按1/4屏幕占比计算窗口尺寸,同时设置尺寸阈值,大屏下保持原有固定尺寸不变,小屏下自动缩小到1/4屏幕占比,完全兼容已开启的高DPI缩放特性,不会破坏原有布局。

效果参考

  • 台式机显示效果:screen
  • 笔记本显示效果:laptop

代码修改方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:30:05