如何在 pyqt 中解决启用 DPI 缩放后 QIcon 模糊的问题

问题描述

如今显示器的分辨率越来越高,如果不启用 DPI 缩放,软件的字体和图标在高分屏下就会显得非常小,看得很累人。从 5.6 版本开始,Qt 便能支持 DPI 缩放功能,Qt6 开始这个功能是默认开启的。

启用 DPI 缩放后,文字不会有太明显的锯齿问题,但是使用 QIcon 设置的图标却会显得很模糊。比如下述代码:

coding:utf-8
import os
import sys

from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget

class Demo(QWidget):

    def __init__(self):
        super().__init__(parent=None)
        self.resize(300, 300)
        self.button = QPushButton(' Shuffle all', self)
        self.button.setIcon(QIcon("Shuffle.png"))
        self.button.move(self.width()//2-self.button.width()//2,
                         self.height()//2-self.button.height()//2)

if __name__ == '__main__':
    os.environ["QT_ENABLE_HIGHDPI_SCALING"] = "0"
    os.environ["QT_SCALE_FACTOR"] = '1.25'
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    app.exec_()

运行结果如下图所示,可以看到图标的锯齿现象非常明显:

如何在 pyqt 中解决启用 DPI 缩放后 QIcon 模糊的问题

问题解决

QIcon 底层依靠 QIconEngine 来绘制图标,生成图标的 pixmap。猜测 QIconEngine 使用 QPainter 绘制图标时没有设置 QPainter.SmoothPixmapTransform 标志位,所以导致只缩放了图标,而没有进行平滑插值。为了解决这个问题,我们可以继承 QIconEngine,重写两个虚方法 paint()pixmap(),代码如下:

coding:utf-8
from PyQt5.QtCore import QPoint, QRect, QSize, Qt
from PyQt5.QtGui import QIcon, QIconEngine, QImage, QPixmap, QPainter

class PixmapIconEngine(QIconEngine):
    """ Pixmap icon engine """

    def __init__(self, iconPath: str):
        self.iconPath = iconPath
        super().__init__()

    def paint(self, painter: QPainter, rect: QRect, mode: QIcon.Mode, state: QIcon.State):
        painter.setRenderHints(QPainter.Antialiasing |
                               QPainter.SmoothPixmapTransform)
        painter.drawImage(rect, QImage(self.iconPath))

    def pixmap(self, size: QSize, mode: QIcon.Mode, state: QIcon.State) -> QPixmap:
        pixmap = QPixmap(size)
        pixmap.fill(Qt.transparent)
        self.paint(QPainter(pixmap), QRect(QPoint(0, 0), size), mode, state)
        return pixmap

class Icon(QIcon):

    def __init__(self, iconPath: str):
        self.iconPath = iconPath
        super().__init__(PixmapIconEngine(iconPath))

接着只要把 QIcon 换成 Icon,并开启 app.setAttribute(Qt.AA_UseHighDpiPixmaps),就能解决图标模糊的问题了,效果如下图所示:

如何在 pyqt 中解决启用 DPI 缩放后 QIcon 模糊的问题

Original: https://www.cnblogs.com/zhiyiYo/p/16259597.html
Author: 之一Yo
Title: 如何在 pyqt 中解决启用 DPI 缩放后 QIcon 模糊的问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582824/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux下使用ssh测试端口是否开启

    当服务器上不允许使用telnet时,可以使用ssh测试远程服务器端口是否开启 具体命令如下 -v 显示连接debug信息 -p port 指定端口 ssh -v -p 80 roo…

    Linux 2023年6月7日
    0113
  • linux学习之shell脚本

    【实验目的】‍ ‌ 通过本实验练习,使学生了解常用SHELL的编程特点,掌握SHELL 程序设计的基础知识。对SHELL程序流程控制、SHELL程序的运行方式、bash程序的调试方…

    Linux 2023年5月27日
    0132
  • PyTorch介绍-保存和加载模型

    本节我们将会看到如何保存模型状态、加载和运行模型预测 import torch import torchvision.models as models 保存和加载模型权重 PyTo…

    Linux 2023年6月14日
    0100
  • MapReduce入门实例——WordCount

    摘要:MapReduce的IDEA配置及WordCount案例 Maven项目配置 创建一个空的Maven项目 打开根目录下的 pom.xml文件,参考配置: UTF-8 3.2….

    Linux 2023年6月8日
    099
  • 【电台谈心】2022罗翔老师回答毕业生的4个问题

    罗翔老师:谢谢这位同学的问题。我回想起自己找工作的经历,其实也是 一地鸡毛。本科毕业的时候,也没有多少招聘会。我只有一个单位,一个单位地去找。少数几家单位让你进去了,聊了聊又觉得你…

    Linux 2023年6月13日
    0118
  • python学习

    python中的字符串以双引号或者单引号表示 长度为L:第一个字节索引为0或-L 最后一个字节索引为L-1或-1 in是二元关系操作,用来判断左侧内容是否在右侧的集合中 float…

    Linux 2023年6月6日
    0103
  • Windows下的SSH Server

    (请注意,本文内容以杂谈为主,稍微提及了一些在MobaXterm中开启SSH Server可能遇到的情况和解决方法,没有多少干货,请酌情查看,谢谢) 最近比较无聊,使用MobaXt…

    Linux 2023年6月6日
    0107
  • 大数据之Hadoop集群中MapReduce的Join操作

    如下两张输入表格 order表 id pid amount 1001 01 1 1002 02 2 1003 03 3 1004 01 4 1005 02 5 1006 03 6 …

    Linux 2023年6月8日
    0101
  • Python中使用%s占位符生成sql与literal转义防止sql注入攻击原理浅析

    问题背景 在后端服务中经常需要通过传入参数动态生成sql查询mysql,如查询用户信息、资产信息等,一条常见的sql如下: SELECT vip, coin FROM user_a…

    Linux 2023年6月6日
    0139
  • MySQL之多表查询、Navicat及pymysql

    一、多表查询 1.1 数据准备 — 建表 create table dep( id int primary key auto_increment, name varchar(20…

    Linux 2023年6月14日
    0107
  • MIT6.828——Lab2(麻省理工操作系统实验)

    Lab2 Lab2 是关于操作系统存储管理的细节。主要是建立内存模型,页表,物理地址映射等。在Lab2之前,请复习好前序知识: Lab2内存管理准备知识 MIT6.828——Lab…

    Linux 2023年5月27日
    0107
  • 每周一个linux命令(netstat)

    基础环境 netstat 命令介绍 打印网络连接、路由表、接口统计信息、伪装连接和多播成员,使用最多的是打印网络连接信息。 netstat 命令安装 yum install net…

    Linux 2023年6月8日
    097
  • Windows Server OS 系列安装

    Windows Server OS 系列安装 Windows Server 2003 Windows Server 2008 Windows Server 2012 Windows…

    Linux 2023年6月13日
    093
  • R语言-基础绘图

    一、R语言绘图系统 二、绘图函数 2.1 高水平绘图函数 plot() 绘制散点图等多种图形 hist() 直方图 boxplot() 箱线图 stripchart() 点图 ba…

    Linux 2023年6月8日
    075
  • 国产化之x64平台安装银河麒麟操作系统

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟v4,CPU使用飞腾处理器。飞腾处理器是ARMv8架构的,在之前的文章中介绍了使用QEMU模拟ARMv8架构安装银…

    Linux 2023年5月27日
    088
  • PXE(cobbler)搭建,自动系统安装

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    0117
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球