pyqt5 高分辨率适配 方案探讨

1、方案一

特点字体 窗口同步放大,且字体是矢量放大,字体控件不会模糊

    from PyQt5 import QtCore
    from PyQt5 import QtCore, QtGui
    # 适应高DPI设备
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)

2、方案二、

特点字体 窗口同步放大,且字体是矢量放大,字体控件会模糊

# 适应Windows缩放
    QtGui.QGuiApplication.setAttribute(QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)

3、方案三  最优方案

特点字体 窗口同步放大,且字体是矢量放大,字体控件不会模糊 且图片也会同步放大

# 是 Python 中的一个内置函数,用于判断一个对象是否具有指定的属性或方法。
    # 这个属性用于启用高DPI缩放。当应用程序在高分辨率的显示设备上运行时,
    # Qt会自动根据系统的DPI设置来缩放界面元素,
    # 使得界面在不同分辨率的显示器上具有合适的大小和清晰度。此属性应在创建QApplication对象之前设置
    # if hasattr(QtCore.Qt, 'AA_EnableHighDpiScaling'):
    #    print("AA_EnableHighDpiScaling")
    QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True)  # 适应高DPI设备
    # if hasattr(QtCore.Qt, 'AA_UseHighDpiPixmaps'):
    #     print("AA_UseHighDpiPixmaps")
    # 这个属性用于启用高分辨率位图的支持。当设置为true时,
    # Qt会尝试使用高分辨率版本的位图(如果有的话),
    # 以保证在高DPI显示设备上图标和其他图形元素的清晰度。这对于那些使用像素图(如PNG或JPEG图像)作为界面元素的应用程序尤其有用
    QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, True)

4、更改放大因子,通过更改环境变量实现

方案特点,以上三个的优点都具备,但是有一个致命缺点,字体不会放大

QT_SCALE_FACTOR 放大的比例  字体不会放大

QT_SCREEN_SCALE_FACTORS 缩小的比例  字体不会放大

import os
    import sys

    # 设置QT_SCREEN_SCALE_FACTORS环境变量
    # os.environ["QT_SCREEN_SCALE_FACTORS"] = "2;1.5"  # 假设你有两个屏幕,第一个屏幕缩放因子为2,第二个屏幕缩放因子为1.5
    # os.environ["QT_SCREEN_SCALE_FACTORS"] = "2.25"   # 字体不会跟着放大
    os.environ["QT_SCALE_FACTOR"] = "0.75"

最最优方案

可以根据自己的高分辨率屏幕修改算法

def QhGetScreenResolution():
    # 获取屏幕分辨率(显示&物理)
    # 作者:阙辉
    import tkinter as tk
    import pyautogui
    # 创建一个隐藏的 Tkinter 根窗口
    QhRoot = tk.Tk()
    QhRoot.withdraw()  # 隐藏根窗口
    # 获取屏幕显示分辨率
    QhXSwidth = QhRoot.winfo_screenwidth()
    QhXSheight = QhRoot.winfo_screenheight()
    # 关闭 Tkinter 根窗口
    QhRoot.destroy()
    print(f"屏幕显示分辨率QH: {QhXSwidth}x{QhXSheight}")
    # 获取屏幕物理分辨率
    size = pyautogui.size()
    QhWLwidth = size.width
    QhWLheight = size.height
    print(f"屏幕物理分辨率QH: {QhWLwidth}x{QhWLheight}")
 
    return QhXSwidth,QhXSheight,QhWLwidth,QhWLheight
 
 
if __name__ == "__main__":
    # 是 Python 中的一个内置函数,用于判断一个对象是否具有指定的属性或方法。
    # 这个属性用于启用高DPI缩放。当应用程序在高分辨率的显示设备上运行时,
    # Qt会自动根据系统的DPI设置来缩放界面元素,
    # 使得界面在不同分辨率的显示器上具有合适的大小和清晰度。此属性应在创建QApplication对象之前设置
    # if hasattr(QtCore.Qt, 'AA_EnableHighDpiScaling'):
    #    print("AA_EnableHighDpiScaling")
    # QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True)  # 适应高DPI设备
    # if hasattr(QtCore.Qt, 'AA_UseHighDpiPixmaps'):
    #     print("AA_UseHighDpiPixmaps")
    # 这个属性用于启用高分辨率位图的支持。当设置为true时,
    # Qt会尝试使用高分辨率版本的位图(如果有的话),
    # 以保证在高DPI显示设备上图标和其他图形元素的清晰度。这对于那些使用像素图(如PNG或JPEG图像)作为界面元素的应用程序尤其有用
    # QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, True)

    QhShiPeiBeiShu = {
        "3840" : 2,
    }
    # 获取屏幕分辨率(显示&物理)
    QhXSwidth,QhXSheight,QhWLwidth,QhWLheight = QhGetScreenResolution()
 
    if QhWLwidth>1920:
        # 是否启动适配比例
        import os
        QhFd = int(QhWLwidth/QhXSwidth)  # 计算缩放比例
        # 设置QT_SCREEN_SCALE_FACTORS环境变量
        if QhFd == 1:
            QhFd0 = QhShiPeiBeiShu[str(QhWLwidth)]
            os.environ["QT_SCREEN_SCALE_FACTORS"] = "{}".format(str(QhFd0))
        elif QhFd > 1:
            os.environ["QT_SCREEN_SCALE_FACTORS"] = "{}".format(str(QhFd))
        # QApplication.setHighDpiScaleFactorRoundingPolicy(
        #     Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
        # QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
        # QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)
        QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True)  # 适应高DPI设备
        QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, True)
    qh_app = QApplication(sys.argv)                 # 创建应用实例              # 创建应用实例
    qh_MyWindows = QhAPPGUI()                        # 创建窗口实例
    qh_MyWindows.show()                             # 显示窗口
    qh_n = qh_app.exec()              # 执行exec()方法,进入事件循环,如果遇到窗口退出命令,返回整数qh_n
    print(qh_n)                       # 输出输出关闭事件返回的整数
    try:                              # 捕获程序退出事件
        sys.exit(qh_n)                    # 通知python系统,结束程序运行
    except SystemExit:
        print("请在此做一些其他工作。")       # python解释器停止执行前的工作

<think>好的,用户的问题是关于如何在PyQt5中设置高分辨率屏幕适配的。首先,我需要回顾一下相关的知识,并结合之前提供的引用内容来整理出一个清晰的回答步骤。 首先,根据引用中的信息,用户提到在高分辨率屏幕上,PyQt5应用程序可能会出现字体小或布局混乱的问题。解决方法包括设置QtCore.Qt.AA_EnableHighDpiScaling属性,以及使用环境变量或Qt的版本相关设置。 接下来,我需要确定回答的结构。用户希望了解具体的设置方法,所以应该分步骤说明。同时,需要确保LaTeX格式的正确应用,比如行内公式用$...$,独立公式单独成段用$$...$$。不过在这个问题中可能涉及公式较少,主要关注代码示例和配置步骤。 然后,检查引用内容中的关键点:设置AA_EnableHighDpiScaling属性,环境变量QT_SCALE_FACTOR和QT_AUTO_SCREEN_SCALE_FACTOR,以及Qt5.14后的setHighDpiScaleFactorRoundingPolicy方法。此外,还需要注意在创建QApplication实例前进行这些设置,以确保生效。 还要考虑用户可能遇到的常见问题,例如不同缩放比例的显示器适配,或者多屏幕环境下的显示问题。根据引用内容,测试方法是在Windows的显示设置中调整缩放比例,观察应用程序的自适应情况。 最后,生成相关问题,可能涉及优化方法、多屏幕适配、不同Qt版本的差异等,确保问题与主题相关,帮助用户进一步了解。 在组织语言时,要使用中文,结构清晰,步骤明确,代码示例正确放置,并正确添加引用标识。同时,注意用户可能对技术细节不熟悉,需要解释清楚每个步骤的作用和必要性。</think>### PyQt5高分辨率屏幕适配方法 要让PyQt5应用程序适配高分辨率屏幕,需通过以下步骤解决DPI缩放问题: #### 1. **启用高DPI缩放属性** 在创建`QApplication`实例前,调用`QtCore.Qt.AA_EnableHighDpiScaling`实现自动缩放: ```python from PyQt5 import QtCore, QtWidgets QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True) app = QtWidgets.QApplication([]) ``` 此方法会根据屏幕的像素密度自动调整界面缩放比例[^2][^3]。 #### 2. **手动设置环境变量(可选)** 若需强制指定缩放系数,可通过环境变量控制: ```python import os os.environ["QT_SCALE_FACTOR"] = "1.5" # 缩放倍数(如150%) os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1" # 启用屏幕自适应 ``` 此方法适用于需要固定缩放的场景[^4]。 #### 3. **高版本Qt的优化策略(Qt5.14+)** 对于Qt5.14及以上版本,可设置缩放策略: ```python QtCore.QCoreApplication.setHighDpiScaleFactorRoundingPolicy( QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough ) ``` 该策略可避免系统缩放导致的模糊问题[^3]。 #### 测试方法 在Windows 10/11中调整系统缩放比例(设置→系统→屏幕→缩放与布局),观察界面元素是否自适应。若文本和控件随缩放比例变化而保持清晰,则配置成功。 #### 完整代码示例 ```python import os from PyQt5 import QtCore, QtWidgets os.environ["QT_ENABLE_HIGHDPI_SCALING"] = "1" QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True) app = QtWidgets.QApplication([]) window = QtWidgets.QMainWindow() window.show() app.exec_() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值