gpt4 book ai didi

c++ - 在不调用 setSizeIcon() 的情况下动态调整 QIcon 的大小

转载 作者:行者123 更新时间:2023-11-30 01:13:40 25 4
gpt4 key购买 nike

我目前正在努力解决一个应该很容易解决的问题。许多小部件支持某种QSizePolicy。这包括 QPushbutton。在我的例子中,我在网格布局中有多个按钮,所有这些按钮都将用于垂直和水平调整大小的 QSizePolicy 设置为扩展。这会导致根据网格布局所属的小部件的大小调整按钮大小的不良结果。

问题来自 Qt 中图标的处理方式。 QIcon 没有 QSizePolicy 属性(或者至少我无法在 Qt4 的官方文档中找到关于 QIconQAbstractButton 的属性)。唯一的方法似乎是使用 setIconSize(),您可以在其中提供图标的最大尺寸。此外,必须手动实现一个关于如何更新尺寸的例程。在这种情况下,它将是(此处抽象写作)icon.size == button.size-CONSTANT,其中 CONSTANT 是某种预定义因子 (>= 0)。为所选图标预定义各种尺寸(QIcons 列表)也是可能的,但仍然不是一个好的选择(阅读下面的原因)。

这似乎有点矫枉过正,特别是因为 QPushbutton 支持 QSizePolicy 并且开发人员根本不需要修补这个部门,除非他/她想要进行一些特殊的调整大小。这也与 QIcon 中支持 SVG 文件的支持相矛盾,因为众所周知,SVG = vector 图形 = 你可以随意拉伸(stretch)它们而不会降低质量。

有没有人知道一种简单的方法来做到这一点,而无需添加额外的偶数 handle 来调整大小、提供所选图标的比例列表或将大小限制为最大大小?

PS:我也研究了 QPixmap - 仍然存在相同的问题。

编辑:我忘了提到一种方法,我发现了如何做我想做的事(但结果并不像我希望的那样漂亮)——在 QPushbutton 的样式表中使用 image 属性。但是,这不会创建图标!如果一个人并不真的需要一个真正的图标并且可以只使用一个绘制的按钮,那么使用这个属性可以在调整大小方面提供巨大的灵 active ,尤其是在使用 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

图标的最大尺寸受 QIcon 中用作输入的 png 尺寸的限制。如果 svg 用作 QIcon 的输入,则图标的缩放比例将不受大小限制。不过svg图标在windows7好像不支持,但是在ubuntu中是有的。

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

关于c++ - 在不调用 setSizeIcon() 的情况下动态调整 QIcon 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31742194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com