动态调整 QIcon 大小,无需调用 setSizeIcon()

2023-12-01

我目前正在努力解决一个应该很容易解决的问题。许多小部件都支持某种QSize策略。这包括Q按钮。就我而言,我在网格布局中有多个按钮,所有这些按钮都有各自的 QSizePolicy垂直和水平调整大小设置为扩大。这导致按钮的大小根据网格布局所属的小部件的大小进行调整。

问题来自于 Qt 中图标的处理方式。 QIcon 没有 QSizePolicy 属性(或者至少我无法在 Qt4 的官方文档中找到有关QIcon and QAbstractButton)。唯一的方法似乎是使用设置图标大小()您可以在其中指定图标的最大尺寸。此外,还必须手动执行一个关于如何更新大小的例程。在这种情况下,它会是(这里写摘要)icon.size == Button.size-CONSTANT,其中 CONSTANT 是某种预定义因子 (>= 0)。也可以为所选图标预定义各种尺寸(QIcons 列表),但这仍然不是一个好的选择(请阅读下面的原因)。

这似乎有点矫枉过正,特别是因为 QPushbutton 支持 QSizePolicy 并且开发人员根本不需要在这个部门进行修改,除非他/她想要进行一些特殊的大小调整。此外,这与对 SVG 文件的支持相矛盾,SVG 文件可用于QIcon因为,正如我们所知,SVG = 矢量图形 = 您可以随意拉伸它们,而不会损失质量。

有谁知道一种简单的方法来做到这一点,而不需要添加额外的偶数手柄来调整大小,提供所选图标的比例列表或将尺寸限制为最大尺寸?

PS:我也研究过 QPixmap - 仍然有同样的问题。

EDIT:我忘了提及一种方法,我找到了如何做我想做的事情(但是结果并不像我想要的那么漂亮) - 使用image样式表中的属性QPushbutton。然而,这不会创建图标!如果不需要真正的图标而只需使用绘制的按钮,则使用此属性可以在调整大小方面提供巨大的灵活性,尤其是在使用 SVG 时。


子分类QPushButton正如 @Pavel 在评论中所建议的,似乎是解决您的问题的合理选择。下面我提供了一个简单的示例,展示了如何在PySide.

import sys
from PySide import QtGui, QtCore

class myContainter(QtGui.QWidget):
    def __init__(self, parent=None):
        super(myContainter, self).__init__(parent)

        icon = QtGui.QIcon('process-stop.png')

        grid = QtGui.QGridLayout()

        for i in range(3):
            button = myPushButton()
            button.setIcon(icon) 

            grid.addWidget(button, i, 0)

            grid.setRowStretch(i, i)

        self.setLayout(grid)


class myPushButton(QtGui.QPushButton):
    def __init__(self, label=None, parent=None):
        super(myPushButton, self).__init__(label, parent)

        self.pad = 4     # padding between the icon and the button frame
        self.minSize = 8 # minimum size of the icon

        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Expanding)
        self.setSizePolicy(sizePolicy)

    def paintEvent(self, event):

        qp = QtGui.QPainter()
        qp.begin(self)

        #---- get default style ----

        opt = QtGui.QStyleOptionButton()
        self.initStyleOption(opt)

        #---- scale icon to button size ----

        Rect = opt.rect

        h = Rect.height()
        w = Rect.width()
        iconSize = max(min(h, w) - 2 * self.pad, self.minSize)

        opt.iconSize = QtCore.QSize(iconSize, iconSize)

        #---- draw button ----

        self.style().drawControl(QtGui.QStyle.CE_PushButton, opt, qp, self)

        qp.end()

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)

    instance = myContainter()  
    instance.show()    

    sys.exit(app.exec_())

结果是:

enter image description here

图标的最大尺寸受屏幕尺寸的限制png用作输入QIcon. If a svg用作输入QIcon,图标的缩放不会受到大小限制。不过,svg图标在Windows7中似乎不支持,但在Ubuntu中是支持的。

如果将标签添加到按钮,则需要扩展上面的代码。此外,如果需要,还可以将标签的字体大小缩放到按钮大小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态调整 QIcon 大小,无需调用 setSizeIcon() 的相关文章

  • Mono 无法保存用户设置

    我在 Mono Ubuntu 上保存用户设置时遇到问题 这是代码示例 private void Form1 Load object sender EventArgs e string savedText Properties Setting
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

    从 C 11 开始 可以写类似的东西 include
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 元素和 svg 形状之间的白线

    大家好 我正在使用由 shapedivider 生成的 svg 整形器 您可以看到 有一条白线 我不知道为什么它在那里以及如何删除它 请你帮助我好吗 有形状分隔符的代码 custom shape divider bottom 1640714
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它

随机推荐

  • Youtube API 违反安全沙盒

    我收到一条非常烦人的运行时错误消息 该消息使我的 Flash 应用程序在浏览器中运行时崩溃 当我尝试访问 Youtube 的 Gdata api 时 该错误与 安全沙箱违规 有关 确切的错误消息如下 Error Request for re
  • 如何通过移动设备连接到拥有多个站点的Homestead?

    我正在 Laravel 中开发一个网站 该网站在 Homestead 0 2 0 上运行 我想尝试用我的手机和平板电脑连接到它 以便我可以在这些设备上测试该网站 所以我四处搜寻 试图找出如何做到这一点 但是 我找不到任何考虑多个站点的文章
  • 如何使用 com.sun.net.httpserver.HttpsServer 要求客户端证书

    我想要求使用基于Java 1 7内置的服务器进行客户端证书身份验证HTTPS服务器 我似乎找不到任何方法使服务器无法通过身份验证 它会愉快地向任何旧客户端提供数据 无论其客户端证书是否受信任 未知或完全不存在 我对文档的阅读表明设置 Htt
  • 在C中定义结构体数组?

    main h define DATA struct data DATA int id char data main c DATA listOfData 100 所以此时我将 应该能够访问列表中的数据 如下所示 printf listOfDa
  • Node.js 17.0.1 Gatsby 错误 - “数字信封例程::不支持... ERR_OSSL_EVP_UNSUPPORTED”[重复]

    这个问题在这里已经有答案了 我正在构建一个Gatsby地点 我将 Node js 升级到v17 0 1 当我运行构建时 出现错误 Error digital envelope routines unsupported opensslErro
  • 禁用单个 JComboBox 项目

    这是一个相当常见的问题 我使用的解决方案类似于我搜索的内容后来发现 一个实现了ListCellRenderer with a JLabel根据当前选定的索引启用或禁用自身 public Component getListCellRender
  • 获取连续的字母,将每个字母转换为数字,并对组中的数字求和

    假设我有这两个相关的数组 letters a b c d e replace 1 5 10 15 20 以及一串用空格分隔的字母 text abd cde dee ae d 我想将连续的字母转换为各自的数字 将数字相加 然后用总数替换原始字
  • 防止子元素在 Flexbox 中溢出其父元素[重复]

    这个问题在这里已经有答案了 我正在开发一个网络应用程序 它显示一个大的卡片网格 其高度本质上是可变的 为了美观 我们使用了 jQuery matchHeight 使每行中的卡片高度相等 它的性能不能很好地扩展 所以今天我已经迁移到基于弹性盒
  • Codeigniter is_cli_request() 停止 cpanel cron 作业的工作

    在我的网站上 我在 cpanel 上使用 cron 作业 我在控制器的构造区域中有下面的代码 但它阻止了 cpanel cron 作业的工作 if this gt input gt is cli request show error Dir
  • spring.codeconfig 与 xml 配置

    我已经使用 spring net 进行 xml 配置一段时间了 一个月前我刚刚看到 spring 团队发布了 CodeConfig 我喜欢 xml 配置的一点是 如果实时服务器出现问题 我可以轻松更改 xml 配置以启用某些特定的调试设置
  • Windows 7 上的 WAMP 403 禁止消息

    我已经在我的 Windows 7 机器上安装了 WAMP 2 1 版 当我在浏览器中浏览到 localhost 时 可以看到 WAMP 服务器页面 但是当我在浏览器中浏览我的 IP 时 我收到消息 403 Forbidden 您无权访问此服
  • 如果我将一个重物体作为参数传递给某个函数,成本是多少

    假设我有一个对象 ClassRoom 在 ClassRoom 中有许多具有 20 多个属性的 Student 对象 50 个对象 许多具有超过 20 个属性的 Teacher 对象 10 个对象 ClassRoom 还有一些其他属性 如 c
  • preg_match() 因包含斜杠的字符串而失败

    我有一个这样的函数 function in array r item array return preg match item i json encode array 然后我像这样使用它 if in array r row name ite
  • 如何从类中获取字节码作为字节数组

    给定一个任意的Class实例 包括运行时生成的实例 没有 class磁盘上的文件 有什么方法可以获取类字节吗 一般来说 这是不可能的 加载类时 JVM 会解析其字节码并将其转换为内部表示形式 之后 JVM 可以自由地忘记原始字节码 这就是
  • YouTube API v3 Java 授权

    我正在使用 YouTube 数据 API Java 将视频上传到我的 YouTube 频道 我在我的 Windows PC 上测试了它并且成功了 但示例中的授权通过打开浏览器窗口来登录 Google 来创建 Credential 实例 这在
  • 替换空格,但仅在限制之间替换 php

    我想使用 PHP 将空格替换为另一个字符串 我这样做如下 string whatever text including some text between delimiters and string replaced preg replac
  • C++ - 从注册表读取的值中获取空值

    我的应用程序可以正确读取和写入注册表 现在 我需要从以下位置读取注册表值 HKEY LOCAL MACHINE SOFTWARE Microsoft Cryptography MachineGuid 这是我的代码 bool GetWindo
  • 异常后继续 while 循环

    我有这段代码 我想返回到循环的开头并再次请求用户输入 然而 它总是循环不停地询问输入 我的代码有什么问题吗 谢谢 while true try int choice input nextInt lt lt this should stop
  • 为什么 NSUserDefaults 无法保存 NSMutableDictionary?

    我正在尝试保存一个NSMutableDictionary with NSUserDefaults 我在 stackoverflow 上阅读了很多关于该主题的帖子 我还发现了一个有效的选项 但不幸的是它只工作了一次 然后它开始只保存 空 有人
  • 动态调整 QIcon 大小,无需调用 setSizeIcon()

    我目前正在努力解决一个应该很容易解决的问题 许多小部件都支持某种QSize策略 这包括Q按钮 就我而言 我在网格布局中有多个按钮 所有这些按钮都有各自的 QSizePolicy垂直和水平调整大小设置为扩大 这导致按钮的大小根据网格布局所属的